我可以将多个处理器的注释放入 Java 类中吗?
Posted
技术标签:
【中文标题】我可以将多个处理器的注释放入 Java 类中吗?【英文标题】:Can I put annotations for multiple processors into a Java class? 【发布时间】:2010-11-05 06:28:01 【问题描述】:我不太确定注释实际上是如何工作的。我在同一个类上使用 JAXB 和 JPA(带有 eclipselink),即。 e.我得到这样的类定义:
@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 中)和我想知道注释是否会相互干扰?
【问题讨论】:
【参考方案1】:不,他们没有。
我删除了所有其他注释并切断了继承,最终得到了一个非常简单的类。问题依然存在。
我的帖子中没有提到的一件事(因为我认为它不相关)是我在一个 OSGi 容器中运行它(如果这很重要,Felix)。现在,这样的容器将不同的“bundle”相互屏蔽,因此在您专门“导出”包之前,它们无法看到彼此的类。
带注释的类与我的 persistence.xml 位于不同的包中,我假设我可以从另一个包中导入带注释的类并在其他地方执行持久性初始化。事实证明我不能,虽然我还没有真正理解为什么。
因此,如果您将 JPA 与 OSGi 捆绑包一起使用,则必须确保:
带注释的类和persistence.xml 在同一个包中 此包导出包含注释类的包 持久性单元列在包的清单文件中然后,您可以在不同的包中执行实际的持久性操作(例如调用 EntityManager.persist)。
作为旁注,我在尝试跨包使用 JAXB 注释时得到了similarly weird errors。似乎 JAXBContext 和/或 ObjectFactory 必须在包含注释类的同一个包中实例化。我无法确定这一点,但将东西放在同一个包中会有所帮助。
如果对 OSGi、类加载和注释有更深入了解的人可以评论这里可能发生的事情,那就太好了。
更新:导出/导入正确的注释包可能使您能够在不同的包中拥有 persistence.xml 和注释类,请参阅here。不过还没有测试。
【讨论】:
【参考方案2】:注释不能干扰其他注释,尤其是。如果来自不同的包并且具有不同的名称,则不会。每个框架(JAXB 和 Hibernate)都有自己的注释。每个框架只自省自己的注释。我很确定这不是这里的问题。
请检查您的实体是否有这个:
a) 无参数构造函数(默认构造函数很好,但是如果你只有带参数的构造函数,你必须向 JPA 提供一个无参数构造函数,这可以被保护或包可见....)
b) 字段或 getter 上的 @Id 注释(我们总是使用基于字段的注释,否则永远不要将 JPA getter 注释与类型中的字段注释混合!)
c) 类型在您的持久性单元中,并且使用了您的持久性单元
d) 类型有一个@Entity 注解
如果您使用继承(扩展 NamedEntity),您必须向 JPA 提供更多信息,了解如何映射它。首先尝试删除扩展 NamedEntity 的东西。而不是看一个很好的 JPA 教程,它解释了继承变体。
【讨论】:
+1 作为清单,这通常非常有用。但是,在发布之前,我已经完成了它。我终于认为这是一些我仍然不太了解的类加载问题,但无论如何都能解决/解决。另请参阅我自己的答案。以上是关于我可以将多个处理器的注释放入 Java 类中吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以将存储过程的结果放入 SQL 中另一个存储过程中的游标中吗