2010-12-30 15 views
15

Kimliğin, eşlenmiş bir üst sınıfta tanımlanması durumunda, her bir tablo için ayrı dizileri belirtmenin bir yolu var mı? Bizim uygulamadaAlt sınıflarda Hazırda Bekleme alt tablosundaki tablo başına ayrı sıralama belirtme

Tüm varlıklar bir üst sınıf böyle DataObject denilen uzatmak:

@MappedSuperclass 
public abstract class DataObject implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "id") 
    private int id; 
} 

@Entity 
@Table(name = "entity_a") 
public class EntityA extends DataObject { ... } 

@Entity 
@Table(name = "entity_b") 
public class EntityB extends DataObject { ... } 

Bu paylaşılan bir diziyi, varsayılan hibernate_sequence kullanmak için tüm varlıkları neden olur.

Yapmak istediğim, yukarıdaki örnekte entity_a_sequence ve entity_b_sequence gibi her varlık için ayrı bir sıra kullanmaktır. Alt sınıflarda kimlik belirtildiyse, her varlık için bir sıra belirtmek üzere @SequenceGenerator ek açıklamasını kullanabilirdim, ancak bu durumda kimlik üst sınıftadır. Kimliğin üst sınıfta olduğu göz önüne alındığında, her varlık için ayrı bir sıra kullanabileceğim bir yol var mıdır - ve eğer öyleyse, nasıl?

cevap

25

Eğer bu şekilde yapıyor denediniz (Biz alakalı durumunda, PostgreSQL 8.3 kullanıyorsanız)?

@MappedSuperclass 
public abstract class DataObject implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen") 
    @Column(name = "id") 
    private int id; 
} 

@Entity 
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entityaseq") 
@Table(name = "entity_a") 
public class EntityA extends DataObject { 

} 

@Entity 
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entitybseq") 
@Table(name = "entity_b") 
public class EntityB extends DataObject { 

} 

Üzgünüm, şu anda onu test etmek için gerekli ortama sahip değilim ama daha sonra deneyeceğim.

+1

Evet - işe yarıyor! Ben benzer bir şey denedim ama "org.hibernate.AnnotationException: Bilinmeyen Id.generator: idgen" almaya devam etti. Ancak kodunuz iyi çalıştı; ilk denememde alt sınıflardan birinde '@ SequenceGenerator 'eklemeyi unuttuğum ortaya çıkıyor. Bu yüzden cevap, her varlık alt sınıfının üzerinde @SequenceGenerator ek açıklamasına sahip olduğu sürece işe yarayacağıdır. – gutch

1

TABLO nesil stretergy her masanın için ayrı db dizisini kullanır ama

0

IHMO bunu yapmak için daha iyi bir yol yoktur biraz pahalı bir işlemdir:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int id; 

Benim app çalışır.

+1

Veritabanının kimlikleri oluşturmak için yerel yöntemini (örneğin, MySQL'de auto_increment) kullanır ve daha sonra, insertlerin, oluşturulan kimliklerin veritabanı sürücüsünden alınması için tek tek yapılması gerektiğinden, yığın eklemeleri için çok verimsizdir. – Frans

3

Biz bu bizim JPA tarafın bütün soyut üst sınıfta kullanın:

@Id 
@GeneratedValue(generator = "pooled") 
@GenericGenerator(name = "pooled", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = { 
     @org.hibernate.annotations.Parameter(name = "value_column_name", value = "sequence_next_hi_value"), 
     @org.hibernate.annotations.Parameter(name = "prefer_entity_table_as_segment_value", value = "true"), 
     @org.hibernate.annotations.Parameter(name = "optimizer", value = "pooled-lo"), 
     @org.hibernate.annotations.Parameter(name = "increment_size", value = "100")}) 
private Long id; 

Biraz ayrıntılı, ama sen id alan veya tekrar etmek zorunda kalmamak demektir prefer_entity_table_as_segment_value ayar veriyor Alt sınıflarda jeneratör ek açıklamaları.

İlgili konular