Adyz
Adyz

Reputation: 302

Multiple persistance unit in persistence.xml creating tables in one another

I am using JPA (hibernate) and have the following persistence.xml

<persistence version="1.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_1_0.xsd">
    <persistence-unit name="DB1" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.dto1.AccessRight</class>
        <class>com.dto1.Component</class>
        <class>com.dto1.UserRight</class>      
        <properties>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
    <persistence-unit name="DB2" transaction-type="RESOURCE_LOCAL">
        <class>com.dto2.Auditlog</class>
        <properties>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

In code i use the following to get EntityManager factory the following way:

private static final EntityManagerFactory emf_db1 = Persistence.createEntityManagerFactory(DB1_PU_NAME, getConnectionProps(DB1_PU_NAME));
    private static final EntityManagerFactory emf_db2 = Persistence.createEntityManagerFactory(DB2_PU_NAME, getConnectionProps(DB2_PU_NAME));

    private static Map<String, String> getConnectionProps(String pu) {
        Map<String, String> dbConfProps = null;
        dbConfProps = new HashMap<String, String>();
        // Configure the Database properties
        ConnectionEntity conn_en = ConnectionEntity.getConnectionEntity();
        dbConfProps.put("hibernate.dialect", conn_en.getDbdialect());
        if (pu.equals(DB2_PU_NAME)) {
            dbConfProps.put("hibernate.connection.url", conn_en.getDB2_dburl());
        } else {
            dbConfProps.put("hibernate.connection.url", conn_en.getDB1_dburl());
        }
        dbConfProps.put("hibernate.connection.driver_class", conn_en.getDriver());
        dbConfProps.put("hibernate.connection.username", conn_en.getUsername());
        dbConfProps.put("hibernate.connection.password", conn_en.getPassword());

        return dbConfProps;
    }

    public static javax.persistence.EntityManager getInstance(String persistanceUnit) {

        logger.log("getInstance entered");
        if (persistanceUnit.equalsIgnoreCase(DB1_PU_NAME)) {
            return emf_idm.createEntityManager();
        }
        return emf_logs.createEntityManager();
    }

Where conn_en has the dbConfiguration in a property file and reads from it. The thing what happens is that both database create each other tables on runtime whenever my application performs some task. During the execution i have to make entries in the tables of both databases. DB1 creates extra tables from DB2 and vice-versa. Any suggestion what is going wrong here?

Upvotes: 1

Views: 1721

Answers (1)

Yogesh
Yogesh

Reputation: 4784

Use <exclude-unlisted-classes>true</exclude-unlisted-classes> in both of your persistence units. As per this document entities that are not listed in particular persistence unit will not be managed by this unit!

Update: As per new specification for JPA 2 in jsr317

The set of managed persistence classes that are managed by a persistence unit is defined by using one or more of the following:[81]

 • Annotated managed persistence classes contained in the root of the
   persistence unit (unless the exclude-unlisted-classes element is specified)

and with reference to that following is exclude-unlisted-classes xsd

<xsd:element name="exclude-unlisted-classes" type="xsd:boolean" default="true" minOccurs="0">
<xsd:annotation>
    <xsd:documentation>
        When set to true then only listed classes and jars will 
        be scanned for persistent classes, otherwise the 
        enclosing jar or directory will also be scanned. 
        Not applicable to Java SE persistence units.
 </xsd:documentation>
</xsd:annotation>

Default value of <exclude-unlisted-classes> has been changed to true if you are using JPA 2 for implementation one should use <exclude-unlisted-classes/> only instead of configuration specified above.

Upvotes: 3

Related Questions