【问题标题】:Hibernate link between 2 persistence units?2个持久性单元之间的休眠链接?
【发布时间】:2011-02-04 19:43:05
【问题描述】:

我的问题有点棘手,所以我会尽量让它简单:

我有两个 maven 项目:ProjetA 和 ProjectB。

ProjectA 有以下 persistence.xml 文件:

<persistence-unit name="ProjectAUnit" transaction-type="RESOURCE_LOCAL">
        <class>com.projectA.Client</class>
        <class>com.projectA.InterventionA</class>
    </persistence-unit>

InterventionA 与 Client 实体具有 OneToOne 关系。

ProjectB 有以下 persistence.xml 文件:

<persistence-unit name="projectBUnit" transaction-type="RESOURCE_LOCAL">
        <class>com.projectB.InterventionB</class>
        <class>com.projectB.InterventionOrder</class>
</persistence-unit>

InterventionB 扩展了 InterventionA 类(包含在 .jar 依赖项中):

所有 3 个类 InterventionA、InterventionBClient 都定义在同一个 MySQL 模式 (schema1) 中。

但是 InterventionB 还与另一个 MySQL 模式 (schema2) 中定义的 InterventionOrder 实体具有@OneToOne 关系。 私人干预令干预令;

我收到以下异常:

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.projectA.InterventionA.client references an unknown entity: com.projectA.Client

所以这是我的问题:为什么我要尝试使用 Hibernate/Spring 来实现甚至可能?如果是的话怎么办? :-) 提前感谢您的帮助。

【问题讨论】:

    标签: java hibernate spring jpa-2.0


    【解决方案1】:

    InterventionB 继承了它自己和客户之间的一对一关系(来自 InterventionA)。为了能够定义关系,必须映射目标实体,在项目 B 中,客户端未映射,因此出现错误。由于项目 B 依赖于项目 A,您可以简单地将目标实体添加到项目 B 的 persistence.xml:

    <persistence-unit name="projectBUnit" transaction-type="RESOURCE_LOCAL">
        <class>com.projectB.InterventionB</class>
        <class>com.projectB.InterventionOrder</class>
    
        <class>com.projectA.Client</class>
    </persistence-unit>
    

    【讨论】:

    • @russ-hayward :非常感谢 Russ 的回答,但我现在遇到了另一个问题:com.projectB.InterventionOrder 实体与 Intervention 有以下关系:@OneToOne(optional=false) @JoinColumn(name="ID_INTER") private Intervention intervention; 导致以下异常:“com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'projectBPersistenceUnit.intervention'不存在”`。它应该寻找 ProjectA Persistence Unit 的干预。我怎样才能做到这一点?提前致谢。
    • InterventionA 未映射到 ProjectB 中,因此 Hibernate 无法将关联映射到它。我怀疑 Hibernate 正在搜索映射类以查看哪些实现了 Intervention,只找到 InterventionB 并使用它。您可以通过在项目 B 中映射 InterventionA 然后指定 @OneToOne(optional=false, targetEntity=InterventionA.class) 来修复它。如果这不起作用,最好开始一个新问题,看看是否有人知道解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2014-08-10
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多