我可以将多个处理器的注释放入Java类吗?

时间:2009-06-23 17:57:15

标签: java jpa annotations jaxb

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

@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中)我想知道注释是否会相互干扰?

2 个答案:

答案 0 :(得分:3)

注释不能干扰其他注释,尤其是如果来自不同的包装并且具有不同的名称。每个框架(JAXB和Hibernate)都有自己的注释。每个框架都只反省自己的注释。我非常肯定这不是问题所在。

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

a)没有参数构造函数(默认构造函数没问题,但如果你只有带参数的构造函数,你必须为JPA提供一个无参数构造函数,这可以是受保护的或包可见的....)

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

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

d)该类型具有@Entity Annotation

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

答案 1 :(得分:0)

不,他们没有。

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

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

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

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

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

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

作为旁注,我试图在捆绑包中使用JAXB注释时得到similarly weird errors。看来JAXBContext和/或ObjectFactory必须在包含带注释的类的同一个包中实例化。我无法真正解决这个问题,但是把东西放在同一个捆绑中会有所帮助。

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

更新:导出/导入正确的注释包可能使您能够在不同的包中使用persistence.xml和带注释的类,请参阅here。但是没有测试过。