0

私はこのチュートリアルに従い、別のデータベースを指す別の永続ユニットを追加することに着手しました。広葉樹自身のエンティティを共有するべきではありません。そう...

コア プロジェクトは、これらの新しい Bean で applicationContext.xml を保持するようになりました。

<!-- 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>

コア プロジェクトには、次のファイル /META-INF/in1_persistance.xml もあります。

<persistence-unit name="in1PU" transaction-type="RESOURCE_LOCAL">
    <non-jta-data-source>jdbc/in1</non-jta-data-source>    
    <exclude-unlisted-classes/>
</persistence-unit>

この永続ユニットのプロパティは、blPU のものと非常によく似ています。次に例を示します。

in1PU.hibernate.hbm2ddl.auto=create-drop
in1PU.hibernate.dialect=com.in1.hibernate.SubSQLServer2008Dialect

admin では、新しいリソースが \admin\src\main\webapp\META-INF\context.xml に追加されます。

<Resource name="jdbc/in1" [....] />

また、admin では、新しい jndi リソースが \admin\src\main\webapp\WEB-INF\jetty-env.xml に設定されます。

<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> 

そして、applicationContext-datasource.xml に、以下を追加しました。<jee:jndi-lookup id="in1DS" jndi-name="jdbc/in1"/>

アプリケーションが起動し、次のエラー メッセージが表示されて失敗します。

[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)

なぜこの新しい永続化ユニットが ProductImpl クラスを検索するのか疑問に思っています。使用するためにリストされていません (in1_persistence.xml にリストされているクラスがなく、オンになっています<exclude-unlisted-classes/>)。それは確かにCategoryImplエンティティを見ることができません....私はここで何が間違っていますか?

4

1 に答える 1

1

org.hibernate.ejb.Ejb3Configuration を少しデバッグした後、自分の質問に答えました。

persistence.xml では、.xml だけでは十分ではありません<exclude-unlisted-classes/>。プロパティhibernate.archive.autodetectionも設定する必要があります。基本的に null にすることはできません。そこにある有効な値は"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>

お役に立てれば。

于 2014-01-07T00:44:28.873 に答える