2011-01-30 29 views
11

aşağıdaki "kök" varlık (hazırda bekletme özgü parçalar yorumlandı) adres:ayıran JPA varlıkları ince ayarlar

@Entity 
//@GenericGenerator(name="system-uuid",strategy="org.hibernate.id.UUIDGenerator") 
public class Node extends PersistentEntity { 
    private UUID id; 
    private String name; 
    private String displayName; 

    @Id 
    @GeneratedValue 
    //@GeneratedValue(generator="system-uuid") //instead of above line 
    //@Type(type = "pg-uuid") 
    public UUID getId() { return id; } 

    public String getName() { return name; } 

    public String getDisplayName() { return displayName; } 

    //stuff omitted 
} 

Bunun 6 AS JBoss üzerinde dağıtılan bir kalıcılık bağlamın parçası (3.6 hazırda bekletme) veritabanı için PostgreSQL 9'u kullanarak (en son JDBC4 sürücüsünü kullanarak). PostgreSQL'in kendi uuid sütun türü vardır. Bu, düzgün bir şekilde kullanılabilecek bazı hazırda özgü eşlemelerin kullanılmasını gerektirir (yukarıdaki kodda yorumlanmıştır) - aksi halde hazırda bekletme biçimi UUID alanını BINARY ile eşlemeye çalışır, sonra PostgreSQL lehçesi BINARY'ı desteklemez (görünüşe göre postgre, ikili ve hazırda bekletilen devleri saklamanın iki yolu vardır) ve her şey patlar. Yukarıdaki satırı etkin duruma

çalışan kod üretir, ama bu hazırda üzerinde derleme zamanı bağımlılığı beni zorlar - ı yerine önleyeceğini.

karışımı içine hbm.xml dosyası eklemek çalışırken ve dosya ve ek açıklamalardan gelen verileri birleştirmek değil persistence.xml onu referans fakat sadece ek açıklamalar yok sayar:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="package"> 
    <class name="Node"> 
     <id name="id" type="pg-uuid"> 
      <generator class="org.hibernate.id.UUIDGenerator"/> 
     </id> 
    </class> 
</hibernate-mapping> 

i can "kabartmak "gibi herhangi bir ekstra varlıkları ekleyerek, bu fazladan 2 özelliklerini ekleyerek kadar dosya, ama (hangi Düğüm sınıf çalışmalarını işaret) bunu bile:

@Entity 
public class Host extends Node { 
    //fields, getters, fluff 
}

i aşağıdaki istisna olsun:

hazırda beri
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Node

Düğüm iki kez "bulur". Bunun etrafında zarif bir yolu var mı? İdeal olarak, Node, hazırda bekletilen özelliklere gereksinim duyacağım tek sınıftır ve sınıfların büyük bir hiyerarşisinin kökü olacaktır. Hazırda bekletme bağımlılıklarını hazırda beklemekten veya hbm.xml dosyasında tamamen eşleme yapmayı tercih ederim. tamlık hatırına buraya kullanarak persistence.xml dosya im var:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 
    <persistence-unit name="myPU" transaction-type="JTA"> 
     <jta-data-source>java:/my-postgresql-DS</jta-data-source> 
     <mapping-file>META-INF/hbm.xml</mapping-file> 
     <!-- shouldnt need to list classes here since this is deployed --> 
     <!-- in the same jar as the classes and scanning should work --> 
     <validation-mode>AUTO</validation-mode> 
     <properties> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

Ben "ile JPA Java Sebat" (JPA 2.0 Paket) kontrol (en azından JPA 2.0) yapılamaz olduğunu, ancak UUID hakkında hiçbir şey söylemez, Bu yüzden henüz JPA tarafından desteklenmediklerini varsayalım. – esaj

+0

en azından, serileştirilebilir olan her şeyin desteklendiği (ikili veriye dönüştürülecek) anlamda desteklenir. ama PostgreSQL + Hazırda Bekletme ile bile, – radai

cevap

0

Sen Düğüm sınıf dışı @ Varlık-ek açıklama bırakarak deneyin ve hbm.xml tamamen eşlemek veya listeleme olabilecek tüm persistence.xml dosyasındaki Node hariç ve < hariç tutulduğunda listelenmemiş sınıflar />, sınıfları hbm.xml dosyasında eşleniyor. Bu yaklaşımlardan herhangi birinin gerçekten işe yarayıp yaramadığına dair bir fikir yok, ikincisi de hbm.xml'in sınıfı haritalandırmasını engelleyebilir.

+0

düğümünde Node'den damlamak, "[Node'u uzatır] için hiçbir tanımlayıcı belirtilmemiş" ile sonuçlanır. Eşlemeyi (dışlama bölümü ile) "daraltmaya" çalışırken, düğümde @Entity'yi tutmak hala bir çarpışmaya neden olur (çünkü miras ağacına tırmanır ve yine de bulur, sanırım) – radai

1

ben hbm.xml hakkında özel soru cevap vermeyeceğim rağmen, soruna basitleştirmek veya rota olabilir birkaç önerimiz var.

1) Kimliklerinizi manuel olarak oluşturabilirsiniz. @GeneratedValue kapalı bırakın ve ben sadece hazırda bekletme en 'uuid2' jeneratör gibi bir RFC 4122 uyumlu UUID oluşturmak için Java en UUID.randomUUID() kullanabilirsiniz inanıyoruz. Bu belirli jeneratörü Hazırda Bekletme modunda kullanmadım, ancak tek isteğiniz geçerli bir UUID ise, manuel olarak oluşturuluyormuş gibi görünüyor.

2) Şahsen ben sadece varchar sütunlarında PostgreSQL olmayan kimliği sütunları için de olsa UUIDs() depolar. Veri tabanı uyumu için zaman geldiğinde, UUID'leri günlük dosyalarından kesip yapıştıracağım ve sorgulamayı kolaylaştırır. UUID, İKİLİ olarak depolandığında imkansızdı, bu yüzden onları varchar olarak değiştirdik. UUID sütunlarını dikkate aldık ancak varchar bu kadar çok şeyi basitleştiriyor ve birlikte çalışabilirliği geliştiriyor. Java sınıfınızda String-to-UUID dönüşümünü kapsama almak önemsizdir.

Tabii ki eski nedenlerle UUID sütun türünü kullanmak zorunda olabilir veya performans nedenleriyle tercih olabilir.En az bir kişi performance comparison of the two approaches yaptı.