1

我不太确定注释实际上是如何工作的。我在同一个类上使用 JAXB 和 JPA(带有 eclipselink),即我得到这样的类定义:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Channel")
@Entity
public class Channel extends NamedEntity {
    @XmlAttribute
    @XmlSchemaType(name = "anyURI")
    @Column(name="url")
    protected String url;

    @XmlAttribute
    @Column
    protected String coDirection;
    // etc...
}

现在我遇到了奇怪的错误(例如“com.econemon.suite.common.models.Channel@115c974 不是已知的实体类型”,这通常意味着该类不在我的 persistence.xml 中),我是想知道注释是否会相互干扰?

4

2 回答 2

3

注释不能干扰其他注释,尤其是。如果来自不同的包并且具有不同的名称,则不会。每个框架(JAXB 和 Hibernate)都有自己的注释。每个框架只自省自己的注释。我很确定这不是这里的问题。

请检查您的实体是否有这个:

a) 无参数构造函数(默认构造函数很好,但如果您只有带参数的构造函数,则必须向 JPA 提供无参数构造函数,这可以被保护或包可见....)

b) 字段或 getter 上的 @Id 注释(我们总是使用基于字段的注释,否则永远不要将 JPA getter 注释与类型中的字段注释混合!)

c)类型在您的持久性单元中,并且使用了您的持久性单元

d) 该类型有一个@Entity 注解

如果您使用继承(扩展 NamedEntity),则必须提供更多 JPA 更多信息,以了解如何映射它。首先尝试删除扩展 NamedEntity 的东西。而不是看一个很好的 JPA 教程,它解释了继承变体。

于 2009-06-24T21:08:15.277 回答
0

不,他们没有。

我删除了所有其他注释并切断了继承,最终得到了一个非常简单的类。问题依然存在。

我的帖子中没有提到的一件事(因为我认为它不相关)是我在 OSGi 容器中运行它(如果这很重要,Felix)。现在,这样的容器将不同的“包”相互屏蔽,因此在您专门“导出”包之前,它们无法看到彼此的类。

带注释的类与我的 persistence.xml 位于不同的包中,我假设我可以从另一个包中导入带注释的类并在其他地方执行持久性初始化。事实证明我不能,虽然我还没有真正理解为什么。

因此,如果您将 JPA 与 OSGi 捆绑包一起使用,则必须确保:

  • 带注释的类和 persistence.xml 在同一个包中
  • 此捆绑包导出包含注释类的包
  • 持久性单元列在包的清单文件中

然后,您可以在不同的包中执行实际的持久性操作(例如调用 EntityManager.persist)。

附带说明一下,在尝试跨包使用 JAXB 注释时,我遇到了类似的奇怪错误。似乎 JAXBContext 和/或 ObjectFactory 必须在包含注释类的同一个包中实例化。我无法真正确定这一点,但将东西放在同一个包中会有所帮助。

如果对 OSGi、类加载和注释有更深入了解的人可以评论这里可能发生的事情,那就太好了。

更新:导出/导入正确的注释包可能使您能够在不同的包中拥有 persistence.xml 和注释类,请参见此处。不过还没有测试。

于 2009-06-23T18:12:04.400 回答