2016-05-16 2 views
0

Ich entwickle eine JPA-Anwendung, die auf unterschiedliche Schemas auf der gleichen Datenbank (d. H. DB2/Oracle) zugreifen müssen. Ich möchte, dass alle meine Entitäten in der Datei persistence.xml (<class>) registriert werden und definieren können, welche zu bestimmten Schemas gehören.Wie gemischte Schemas zu bestimmten Klassen in Persistenz-Einheit in Orm/Persistence.xml gesetzt werden

Ich weiß, dass es möglich ist, Java-Annotationen zu verwenden, aber dies ist ein Produkt, das der Endbenutzer benötigt, um das entsprechend zu konfigurieren (daher möchte ich dies in einer XML-Datei erreichen können).

orm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd" 
    version="2.0"> 
    <persistence-unit-metadata> 
     <persistence-unit-defaults> 
      <schema>SECURITY</schema> 
     </persistence-unit-defaults> 
    </persistence-unit-metadata> 
</entity-mappings> 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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="jpa.sample.plain"> 
     <mapping-file>custom-orm.xml</mapping-file> 
     <class>com.reds.model.Role</class> 
     <class>com.reds.model.User</class> 
     <properties> 
      <property name="javax.persistence.target-database" value="PostgreSQL" /> 
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1:5432/security" /> 
      <property name="javax.persistence.jdbc.user" value="user" /> 
      <property name="javax.persistence.jdbc.password" value="password" /> 
      <!-- EclipseLink should create the database schema automatically --> 
      <property name="eclipselink.ddl-generation" value="none" /> 
      <property name="eclipselink.weaving" value="false" /> 
      <!-- <property name="eclipselink.ddl-generation.output-mode" 
       value="database" /> --> 
      <property name="eclipselink.logging.level" value="INFO"/> 
     </properties>  
    </persistence-unit> 
</persistence> 

In den oben genannten Dateien, aus meiner das Verständnis:

Zur Zeit habe ich ein Beispiel wie folgt gefunden Das Schema "SECURITY" wird in der Persistenzeinheit gesetzt, die die Datei ".mp.cmml" enthält (make Ist es der Standard, den eine Anmerkung ändern kann?). Dadurch wird das Schema jedoch implizit zu "SECURITY" für beide Klassen, die in persistence.xml aufgeführt sind.

Im Gegensatz zu den oben ich brauche:

  • Ein Weg, um das Schema auf einer Untergruppe von Klassen in einer Persistenzeinheit auf effiziente Art und Weise zur Liste (es sei denn, wenn der einzige Weg ist, um die Entitätszuordnungen zu tun manuell in der orm.xml, was ich vermeiden möchte und der Endbenutzer würde auch)
  • Halten Sie dies von Hersteller spezifischen XML-Dateien oder Java-Implementierungen wenn möglich (JPA-Standard)
  • Seite Frage: Würde dies Erlaube, dass eine JPQL-Abfrage transparent für 2 Entitäten mit unterschiedlichen durchlaufen wird Schemas mieten?

Details Projekt:

  • Hibernate 5.1, JPA 2.1
  • DB2/Oracle

EDIT:

fand ich diesen Link, die mir geholfen Richte meine orm.xml ein: https://docs.jboss.org/hibernate/stable/annotations/reference/en/html/xml-overriding.html

Geschrieben unten ist der relevanteste Auszug:

3.1.2. Entity level metadata 

You can either define or override metadata informations on a given entity. 

<?xml version="1.0" encoding="UTF-8"?> 

<entity-mappin(1)gs 
    xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd" 
    version="2.0"> 

    <package>o(2)rg.hibernate.test.annotations.reflection</package> 
    <entity cl(3)ass="Administration" access="PROPERTY" metadata-complete="true"> 
     <table(4) name="tbl_admin"> 
      <unique-constraint> 
       <column-name>firstname</column-name> 
       <column-name>lastname</column-name> 
      </unique-constraint> 
     </table> 
     <secon(5)dary-table name="admin2"> 
      <primary-key-join-column name="admin_id" referenced-column-name="id"/> 
      <unique-constraint> 
       <column-name>address</column-name> 
      </unique-constraint> 
     </secondary-table> 
     <id-cl(6)ass class="SocialSecurityNumber"/> 
     <inher(7)itance strategy="JOINED"/> 
     <seque(8)nce-generator name="seqhilo" sequence-name="seqhilo"/> 
     <table(9)-generator name="table" table="tablehilo"/> 
     ... 
    </entity> 

    <entity class="PostalAdministration"> 
     <prima(10)ry-key-join-column name="id"/> 
     ... 
    </entity> 
</entity-mappings> 
1 entity-mappings: entity-mappings is the root element for all XML files. You must declare the xml schema, the schema file is included in the hibernate-annotations.jar file, no internet access will be processed by Hibernate Annotations. 
2 package (optional): default package used for all non qualified class names in the given deployment descriptor file. 
3 entity: desribes an entity. 
metadata-complete defines whether the metadata description for this element is complete or not (in other words, if annotations present at the class level should be considered or not). 

An entity has to have a class attribute refering the java class the metadata applies on. 

You can overrides entity name through the name attribute, if none is defined and if an @Entity.name is present, then it is used (provided that metadata complete is not set). 

For metadata complete (see below) element, you can define an access (either FIELD or PROPERTY (default)). For non medatada complete element, if access is not defined, the @Id position will lead position, if access is defined, the value is used. 

4 table: you can declare table properties (name, schema, catalog), if none is defined, the java annotation is used. 
You can define one or several unique constraints as seen in the example 

5 secondary-table: defines a secondary table very much like a regular table except that you can define the primary key/foreign key column(s) through the primary-key-join-column element. On non metadata complete, annotation secondary tables are used only if there is no secondary-table definition, annotations are ignored otherwise. 
6 id-class: defines the id class in a similar way @IdClass does 
7 inheritance: defines the inheritance strategy (JOINED, TABLE_PER_CLASS, SINGLE_TABLE), Available only at the root entity level 
8 sequence-generator: defines a sequence generator 
9 table-generator: defines a table generator 
10 primary-key-join-column: defines the primary key join column for sub entities when JOINED inheritance strategy is used 
+1

orm.xml können Sie die _table_ und seine _schema_ für eine Entität festlegen. –

+0

@NeilStockton danke Ich habe gerade getan, was Sie gesagt haben und deklariert Entitäten in meinem XML, um es einfacher zu machen, die Schemanamen zu ändern – PragmaticProgrammer

Antwort

0

Nein, Sie können dies über die orm.xml oder persistence.xml Dateien nicht.

Das heißt, Sie können etwas Ähnliches tun, indem Sie das Nicht-Standardschema in Ihrer @Table Annotation für jedes einzelne Persistenzobjekt angeben.

Verwandte Themen