【问题标题】:How do I use the `properties` attribute of @PersistenceContext annotation?如何使用 @PersistenceContext 注释的 `properties` 属性?
【发布时间】:2013-01-24 10:36:12
【问题描述】:

我在我的类中定义了两个实体管理器实例,其中一个覆盖了PersistenceContextproperties 属性,另一个没有:

@PersistenceContext
protected EntityManager em;

@PersistenceContext(properties={@PersistenceProperty(name="hibernate.default_schema", value="archive")})
protected EntityManager emArchive;

我这样做是为了定义一个实体管理器附加到我的默认架构,另一个附加到我的存档架构。

这是我的persistance.xml:

<persistence-unit name="primary" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/PCMain_DS</jta-data-source> 

    <properties>
        <!-- Properties for Hibernate -->
        <!--  property name="hibernate.hbm2ddl.auto" value="update" /-->
        <property name="hibernate.show_sql" value="true" />
    </properties>
</persistence-unit> 

不幸的是,我的程序似乎无法正常工作,因为当我使用存档实体管理器 (emArchive) 保存实体时,它会保存到默认的公共架构中。似乎属性 hibernate.default_schema 没有设置 - 但为什么呢?如何切换架构?

我的工具/环境:

  • JBoss 7.1
  • EJB
  • JPA
  • 休眠

感谢所有帮助,谢谢。

【问题讨论】:

  • 我自己从未尝试过,但是您是否尝试过两个不同的持久性单元,它们指向具有不同架构的同一数据源?这是一个多一点的标记,但如果它是紧急的...... :-)
  • 是的,但这对我不起作用...如果我尝试两个不同的持久性单元指向,我的应用程序未部署消息:原因:java.lang.IllegalArgumentException: JBAS011470: Persistence unitName was not指定并且在应用程序部署“highway-ear.ear”中有 2 个持久性单元定义。要么将应用程序更改为只有一个持久性单元定义,要么为对持久性单元的每个引用指定 unitName。但我设置了单位名称:@PersistenceContext(unitName="primary") & @PersistenceContext(unitName="archive")
  • 再想一想,可能你正在尝试的东西在 JPA 中不起作用。因为实体类映射到数据库中的特定表。您正在尝试为同一个类创建两个映射。在合并到存档持久性单元之前,您正在分离,对吗?因为它仍然连接时肯定行不通。
  • This answer 可能会有所帮助。

标签: java hibernate jpa ejb jboss7.x


【解决方案1】:

还有其他方法可以做到这一点,但这里有一种替代方法:

  1. 在您的 persistence.xml 中定义两个元素
  2. 对于定义的每个持久性单元,使用元素指定每个持久性单元的目标实体名称

这应该负责隔离在每个持久单元中持久存在的实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2014-11-28
    • 1970-01-01
    • 2021-08-05
    • 2012-12-01
    • 2015-02-14
    • 2019-06-26
    相关资源
    最近更新 更多