2016-04-08 15 views
1

@MappedSuperclass işaretli bir soyut temel sınıfım var, bu kimlik özelliği, @Id @GeneratedValue kimlik özelliğinde ayarlanmış.Bir alt sınıftaki @MappedSuperclass öğesinde @Id sütununa uygulanan @GeneratedValue alan ek açıklamasını kaldırmak mümkün mü?

Ayrıca, üretime güvenmek yerine kendi kimliklerini ayarlaması gereken bir @Entity türetim var.

@MappedSuperclass'da ayarlanan kimliğe dayanan çok sayıda türev varlığım var ve her birinde kimliği ayarlamamayı tercih ediyorum.

Sadece bu tür bir varlık için @GeneratedValue nasıl önleyebilirim? Kimliği geçersiz kılmak için kimliği manuel olarak ayarlamayı bekledim ve durum böyle görünmüyor. id kolonu (HSQL) arasında

DDL: bir boş değer id sütun için belirtildiğinde

id bigint generated by default as identity (start with 1) 

http://hsqldb.org/doc/guide/ch02.html#N104B3 kimliği üretilmesi göre, sadece gerçekleşmelidir.

@MappedSuperclass 
class Parent { 
    @Id @GeneratedValue 
    private Long id; 
} 

@Entity 
class Child extends Parent 
    @PrePersist 
    public void prePersist() { 
     LOG.info("PrePersist with id #{}", this.id); 
    } 
} 

Child t = new Child(); 
t.setId(123); 

LOG.debug("Creating: Child #{}", t.getId()); 
childRepository.save(t); // Spring Data JPA Repositories 
LOG.debug("Created: Child #{}", t.getId()); 

// Outputs: 
// Creating: Child #123 
// PrePersist with id #123 
// Created: Child #1 

Düzenleme::

Varsayılan @GeneratedValue strateji kimlikleri şartname izin vermez çıkıyor İşte

bazı örnek kodudur. Veritabanı her zaman bunları üretecektir. Bu

@Id 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "CustomIdGenerator") 
@GenericGenerator(name = "CustomIdGenerator", strategy = "com.foo.CustomIdGenerator") 
private Long id; 

Bu sekans tablo veya yerli neden olur ... ... Bir özel kimlik jeneratör yazmak için gerekli

public class CustomIdGenerator extends SequenceStyleGenerator { 

    @Override 
    public Serializable generate(SessionImplementor session, Object object) 
     throws HibernateException { 
     Serializable id = session.getEntityPersister(null, object) 
      .getClassMetadata().getIdentifier(object, session); 
     return id != null ? id : super.generate(session, object); 
    } 

} 

çıkıyor ... ve şöyle sonra ebeveynin kimlik alanını açıklama Kimlik oluşturma için kullanılacak sekans, ancak varlık üzerinde ayarlanmış olan kimliklere karşı koyma.

cevap

1

Düzeltme: Çalışma yanıtı: Tamam, şimdi JPA yolunda bunu yapmanın bir yolu olmadığını görüyorum, ancak Hazırda Beklet kullanıyorsanız, described here olduğu gibi özel SequenceGenerator yazmayı deneyebilirsiniz. Temel olarak, yalnızca kimlik ayarlanmadığında bir değer (super.generate()'a çağrı) üretecektir.

+0

Bazı örnekler ve DDL ekledim. Sorunu oldukça iyi anlıyorsunuz. –

+0

Cevabı düzenledim, bu çalışmalı – rapasoft

+0

Tamam, şimdi JPA yolunda bunu yapmanın bir yolu olmadığını görüyorum, ancak Hazırda Bekletme özelliğini kullanıyorsanız, özel olarak "Dizi Sırası Göstergesi" yazmayı deneyebilirsiniz. Burada açıklanmıştır] (http://stackoverflow.com/questions/3194721/bypass-generatedvalue-in-hibernate-merge-data-not-in-db). Temel olarak, bir kimlik (yalnızca "super.generate()") çağrısı sadece kimlik ayarlanmadığında üretilir. – rapasoft

İlgili konular