@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.
Bazı örnekler ve DDL ekledim. Sorunu oldukça iyi anlıyorsunuz. –
Cevabı düzenledim, bu çalışmalı – rapasoft
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