2009-06-15 20 views
34

İki tablom var: Ta ve Tb. Tam olarak aynı masa yapısına, ancak farklı masa isimlerine sahipler.JPA, Farklı sınıfları eşlemek için aynı sınıf (varlık) nasıl kullanılır?

Tablo yapılarını eşlemek için bir varlık sınıfı oluşturmaya çalışıyorum. Benim ortak uygulama modüllerimden bazıları, dinamik olarak Ta veya Tb parametrelerini temel alarak sorgulamak ve güncelleştirmek için bu varlık sınıfını kullanacaktır. JPA'da yapılabilir mi? Program sınıfını, varlık sınıfını çalışma zamanında farklı tablolara dinamik olarak eşlemek için nasıl yazabilirim?

cevap

37

Tam olarak istediğiniz gibi yapabileceğinizden emin değilsiniz, ancak aynı sonucu elde etmek için miras kullanabilirsiniz.

Abst tüm alanları ancak

Ta ve Tb Abst devralan ve bir @ tablo ek açıklama Abst her

Kullanım

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 

sahip hiçbir @ tablo ek açıklama bulunmuyor.

örnek kod:

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class abstract AbsT { 
    @Id Long id; 
... 
} 

@Entity 
@Table(name = "Ta") 
public class Ta extends AbsT { 
... 
} 

@Entity 
@Table(name = "Tb") 
public class Tb extends AbsT { 
... 
} 
+6

Çalışıyor, teşekkürler! Ancak, Toplink için TABLE_PER_CLASS desteklenmiyor. @mappedSuperClass yöntemini denedim ve aynı zamanda çalışıyor. –

+4

Inheritance vs MappedSuperClass hakkında belirsiz olanlar için, burada çok iyi tanımlanmış ve karşılaştırılmıştır: http://stackoverflow.com/a/9669719/2278186 – SatA

7

Ayrıca iki farklı kalıcı birimler kullanırsanız alt sınıfları kullanmadan yapabilirsiniz.

Her kalıcı birim benzersiz bir eşleşme kümesi belirtebilir (tablo adı da dahil). Bunu başarmanın bir yolu, iki orm.xml dosyası oluşturmaktır. persistence.xml olarak böyle bir şey gerekir:

orm-1.xml içinde Sonra
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    version="1.0"> 

    <persistence-unit name="mapping-1"> 
     . . . 
     <mapping-file>orm-1.xml</mapping-file> 
     . . . 
    </persistence-unit> 

    <persistence-unit name="mapping-2"> 
     . . . 
     <mapping-file>orm-2.xml</mapping-file> 
     . . . 
    </persistence-unit> 
</persistence> 

:

<?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_1_0.xsd" 
    version="1.0"> 
    <package>mypackage</package> 
    <entity name="myEntity" class="myClass"> 
     <table name="TABLE1"> 
      </table> 
    </entity> 
</entity-mappings> 

Ve orm-2.xml içinde

:

<?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_1_0.xsd" 
    version="1.0"> 
    <package>mypackage</package> 
    <entity name="myEntity" class="myClass"> 
     <table name="TABLE2"> 
      </table> 
    </entity> 
</entity-mappings> 

Sen Her PersistenceUnit için ayrı bir EntityManagerFactory oluşturmanız gerekir (muhtemelen sizin istediğinizi değil), ancak aynı sınıfı farklı veritabanlarında kullanmak istiyorsanız (farklı tablo isimleriyle) bu bir yol olacaktır.

18

@MappedSuperclass ek açıklamalı soyut bir sınıf (bir şablon sınıfı) oluşturun ve ardından uzatın. Her bir sınıf @table, @entity notlarını kullanır ve boş bir kurucudan başka bir şey içermez. Tüm kodlar ana sınıfınızda olacaktır. Yöntemlerinizde, parametre varlığınızın templateClass öğesinden uzandığını ve daha fazla kod değişikliği gerekmediğini belirten jenerikler kullanın. Doğru eşleştirmeler geçtiğiniz her oğlunuzda olacak.

İlgili konular