Hibernate 添加单独的persistenceUnit仍然会查看broadleaf自己的实体,但失败了
我随后开始添加另一个指向单独数据库的持久化单元。它不应该共享broadleaf自己的实体。所以 核心项目现在使用以下新bean保存applicationContext.xml:Hibernate 添加单独的persistenceUnit仍然会查看broadleaf自己的实体,但失败了,hibernate,persistence-unit,broadleaf-commerce,Hibernate,Persistence Unit,Broadleaf Commerce,我随后开始添加另一个指向单独数据库的持久化单元。它不应该共享broadleaf自己的实体。所以 核心项目现在使用以下新bean保存applicationContext.xml: <!-- New data source to our DB --> <bean id="blMergedDataSources" class="org.springframework.beans.factory.config.MapFactoryBean"> <property
<!-- New data source to our DB -->
<bean id="blMergedDataSources" class="org.springframework.beans.factory.config.MapFactoryBean">
<property name="sourceMap">
<map>
<entry key="jdbc/in1" value-ref="in1DS" />
</map>
</property>
</bean>
<bean id="entityManagerFactoryIn1PU"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter" ref="blJpaVendorAdapter" />
<property name="persistenceUnitManager" ref="blPersistenceUnitManager" />
<property name="persistenceUnitName" value="in1PU" />
</bean>
<bean id="blPersistenceUnitManager" class="org.broadleafcommerce.common.extensibility.jpa.MergePersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath*:/META-INF/in1_persistence.xml</value>
</list>
</property>
<property name="persistenceUnitPostProcessors">
<list>
<bean
class="org.broadleafcommerce.common.extensibility.jpa.JPAPropertiesPersistenceUnitPostProcessor">
<property name="persistenceUnitProperties">
<map>
<entry key="in1PU.hibernate.dialect" value="${in1PU.hibernate.dialect}" />
<entry key="in1PU.hibernate.hbm2ddl.auto" value="${in1PU.hibernate.hbm2ddl.auto}"/>
<entry key="in1PU.hibernate.show_sql" value="${in1PU.hibernate.show_sql}"/>
<entry key="in1PU.hibernate.cache.use_second_level_cache" value="${in1PU.hibernate.cache.use_second_level_cache}"/>
<entry key="in1PU.hibernate.cache.use_query_cache" value="${in1PU.hibernate.cache.use_query_cache}"/>
<entry key="in1PU.hibernate.hbm2ddl.import_files" value="${in1PU.hibernate.hbm2ddl.import_files}"/>
<entry key="in1PU.hibernate.hbm2ddl.import_files_sql_extractor" value="${in1PU.hibernate.hbm2ddl.import_files_sql_extractor}"/>
</map>
</property>
</bean>
</list>
</property>
</bean>
在管理中,新资源添加到\admin\src\main\webapp\META-INF\context.xml:
<Resource name="jdbc/in1" [....] />
我想知道为什么这个新的持久化单元会查找ProductImpl类?它没有列出以供使用(在in1_persistence.xml中没有列出的类,并且
处于启用状态)。它肯定看不到CategoryImpl实体。。。。在调试org.hibernate.ejb.ejb3配置之后,我回答了自己的问题
在persistence.xml中,仅仅拥有
是不够的。还必须设置属性hibernate.archive.autodetection
基本上它不能为空。其中的有效值是“class”
,“hbm”
或“class,hbm”
,我们不需要这些值,因此可以将该值设置为任何值,“false”
做得很好
因此,正确的最小persistence.xml是:
<persistence-unit name="in1PU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/in1</non-jta-data-source>
<exclude-unlisted-classes/>
<properties>
<property name="hibernate.archive.autodetection" value="false" />
</properties>
</persistence-unit>
jdbc/in1
希望这有帮助。Hm很高兴知道。从您的调试中,您认为这是我们可以在Broadleaf中缓解的问题,还是这只是Hibernate的一个奇怪的怪癖,我们对此无能为力?这只是Hibernate扫描JAR以查找实体的方式<代码>不足以停止扫描persistence.xml所在的同一个jar中的其余实体。通过使用具有无效值的额外的
hibernate.archive.autodetection
属性,可以修复它。实际上,我是从Broadleaf自己的persistence.xml文件中得到这个想法的:)因此,您唯一能做的就是在教程中添加一个注释,也许,除此之外,没有其他内容。
<Resource name="jdbc/in1" [....] />
<New id="in1DS" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/in1</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">net.sourceforge.jtds.jdbc.Driver</Set>
<Set name="url">jdbc:jtds:sqlserver://localhost:1433;databaseName=DB2</Set>
<Set name="username">xyz</Set>
<Set name="password">xyz</Set>
</New>
</Arg>
</New>
[artifact:mvn] javax.persistence.PersistenceException: [PersistenceUnit: in1PU] Unable to build EntityManagerFactory
[...]
[artifact:mvn] Caused by:
[artifact:mvn] org.hibernate.AnnotationException: @OneToOne or @ManyToOne on org.broadleafcommerce.core.catalog.domain.ProductImpl.defaultCategory references an unknown entity: org.broadleafcommerce.core.catalog.domain.CategoryImpl
[artifact:mvn] at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:109)
<persistence-unit name="in1PU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/in1</non-jta-data-source>
<exclude-unlisted-classes/>
<properties>
<property name="hibernate.archive.autodetection" value="false" />
</properties>
</persistence-unit>