【问题标题】:JPA Entity - Specify Persistence Unit?JPA 实体 - 指定持久性单元?
【发布时间】:2013-04-18 17:54:49
【问题描述】:

我有一个使用多个持久性单元的 JavaEE 项目。有没有办法指定特定 JPA 实体属于哪个持久性单元?一些实体在一个数据源中,而其他实体在我的第二个数据源中。有没有办法使用注释来区分两者?

【问题讨论】:

    标签: database jakarta-ee jpa jpa-2.0 persistence-unit


    【解决方案1】:

    @PersistenceUnit 也应该可以使用(不过我还没有尝试过)

    例如

    @PersistenceUnit(unitName="persistenceUnit2")
    @Entity
    class XPTO {
    }
    

    来自 Javadoc (http://docs.oracle.com/javaee/6/api/javax/persistence/PersistenceUnit.html)

    "表示对 EntityManagerFactory 及其关联的依赖 持久性单元。”

    单位名称 (可选)persistence.xml 文件中定义的持久性单元的名称。

    【讨论】:

    • 有人可以确认这行得通吗?我有不同的实体,我想将它们分配给两个不同的 PersistentUnits - 没有 exclude-unlisted-classes=true
    • @badera:我没用过,我知道它存在,但最后我从来不需要它。我猜没有什么比快速测试更好的了:)
    • 好吧,我测试了它,但它不起作用[对不起,我没有在评论中提到它:)]。所以我想知道是我做错了什么还是真的不起作用。我仍然会很高兴有一个解决方案,我可以在其中注释每个实体,PersistenceUnit(一个或多个)它们应该属于哪个,而不在persistence.xml中列出所有实体类......这对于数百个实体来说很烦人...甚至更少。
    • @badera:所以,您尝试在persistence.xml 上定义另一个持久性单元并使用该@PersistenceUnit(unitName="newName") 什么不完全有效?您可以随时尝试调试代码,看看有什么问题
    • 对不起,但调试这很难,因为我只是看到这个注释没有效果。那为什么没有效果呢?没有效果,我的意思是它的行为就像我没有在 @Entity 上注释 @PersistenceUnit() 一样。如果exclude-unlisted-classes 为假,则所有实体都属于所有持久性单元。我使用带有休眠功能的 Wildfly 8.2.1。我想我必须否决这个答案,因为这是一个无用的建议。或者请提供有效的证明。
    【解决方案2】:

    您还可以通过识别注册实体的 EntityManager 来识别实体属于哪个持久单元。

    一个托管实体属于一个持久化上下文,一个持久化上下文属于一个持久化单元。所以在这个例子中:

    @PersistenceContext(unitName="persistence-unit-1")
    EntityManager em1;
    
    @PersistenceContext(unitName="persistence-unit-2")
    EntityManager em2;
    
    em1.persist(entity1);
    em2.persist(entity2);
    

    entity1 属于 persistence-unit-1,entity2 属于 persistence-unit-2。它不像在 persistence.xml 中指定 标记那么明确,但是您可以在两个持久单元中拥有相同的实体类,并且仍然可以区分每个实体实例属于哪个单元。

    【讨论】:

    • 那么如果你没有在persistence.xml中用标签指定entity1属于persistence-unit-1,你是如何指定它的呢?
    • @badera 在将应用程序部署到完整的 JEE 容器(如 Weblogic、JBoss 或 Webshpere)时,应用程序服务器会自动扫描带有“实体”注释的类,您不需要像使用 Tomcat 这样的 servlet 容器或独立的 Java 应用程序时一样,将 标签添加到 persistence.xml,除非您使用“exclude-unlisted-classes”标签。
    • 我知道。但它怎么知道它属于哪个persistence-unit?看看上面的答案...
    • JPA 规范没有指定它,但如果你不指定“exclude-unlisted-classes=true”,我很确定所有类都属于所有持久性单元。我了解您不想将它们显式添加到 persistence.xml 中。如果所有类都在所有持久性单元中,会有问题吗?如果它们用于不同的数据库模式,您仍然可以在 EntityManager 或 EntityManagerFactory 上指定 pu 名称以连接到正确的数据库,就像我在这个答案中发布的那样。除非您使用自动模式生成,否则在错误的持久性单元中提供可用的类应该不是问题
    • 您写道:除非您使用自动模式生成,否则在错误的持久性单元中提供可用的类应该不是问题 - 这对于方案验证也是如此吗?好的,我可以检查一下。到目前为止,我没想到它不会受伤……如果真的没有,那将是个好消息!谢谢!
    【解决方案3】:

    要指定Entity 属于哪个持久单元,请使用persistence.xml 文件:

    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    
        <persistence-unit name="user" transaction-type="JTA">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <jta-data-source>jdbc/myApp</jta-data-source>
            <class>com.company.User</class>
            <exclude-unlisted-classes>true</exclude-unlisted-classes>
            <properties>
                <!-- properties -->
            </properties>
        </persistence-unit>
    
        <persistence-unit name="data" transaction-type="JTA">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <jta-data-source>jdbc/myApp_data</jta-data-source>
            <!--<mapping-file>META-INF/myApp_entities.xml</mapping-file> You can also use mapping files.-->
            <class>com.company.Data</class>
            <exclude-unlisted-classes>true</exclude-unlisted-classes>
            <properties>
                <!-- properties -->
            </properties>
        </persistence-unit>
    </persistence>
    

    注意&lt;exclude-unlisted-classes /&gt;的使用。

    【讨论】:

    • 所以这需要我将每个实体添加到 persistence.xml,而不是使用注释进行发现,对吗?
    • 是的。从根本上说,为了在持久性上下文之间进行选择,您需要列出每个 persistence.xml 中的所有类,或者列出每个实体中的持久性上下文。两者的工作量似乎相同。但是,对于第一个,所有元数据都在一个地方。
    • 另外,我不知道第二种方法(在实体中列出持久性上下文)是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2013-11-06
    • 1970-01-01
    • 2021-02-17
    • 2021-03-24
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多