Hazırda bekletme, varsayılan olarak, tüm tablolar için (PostgreSQL durumunda) çok kötü IMHO ölçeklendiren ids oluşturmak için kullanılan bir globel dizisi oluşturur. Kullanılacak her varlık türü için belirtebilsem de, bunu yapmayı sevmiyorum. Diziyi açıkça belirtmek istemiyorum ve diziyi jeneratör stratejisi olarak kullanmaya zorlamıyorum, çünkü dizileri destekleyemeyen veritabanları için hazırda bekletme DDL'si olmasını istiyorum. Tek global dizi aynı zamanda birincil anahtar olarak 32-bit int kullanılmasını imkansız kılar, yani tüm int id (ler) ini uzun türe dönüştürmem gerekir.Hazırda bekletme ayarlarını varsayılan olarak her tablo için ayrı bir sıra oluşturmak üzere yapılandırabilir miyim?
cevap
Hazırda bekletme veritabanı bağımsız bir ORM çözümü olmak anlamına gelir, ancak başka bir veritabanı satıcısına geçerken bazı önemli sorunlar ortaya çıkar. Bunlardan biri, temel veri tabanının Otomatik Kimlik oluşturmasıdır. MySQL, Oracle & MS SQL Server'ın tümü, birincil anahtarlar için otomatik kimlik oluşturmak için farklı teknikler kullanır. Yani, göç etmeye başladığımızda çok fazla sorunla karşılaşırız, bu durumun olmaması gereken ekstra iş. Hazırda bekletme 3.2.3 Hazırda Bekletme tarafından uygun bir çözüm bulunmamakla birlikte, 3.2.3 sürümünde hazırda bekleten çocuklar, herhangi bir veritabanında iyi çalışan bir taşınabilir ID üreteci sunmayı mümkün kıldılar. İki
- org.hibernate.id.enhanced.SequenceStyleGenerator
“yaklaşım içinde taşınabilirliği fiziksel bir DİZİNİ kullanıp kullanmadığınızı gerçekten dont care olduğu alır şunlardır veritabanı; Gerçekten sadece dizi benzeri bir nesil neslin olmasını istiyorsunuz. SEQUENCES'i destekleyen veritabanlarında, SequenceStyleGenerator aslında SEQUNCE'yi değer üreteci olarak kullanacaktır; SIRALANLARI desteklemeyen veritabanları için, değer üreteci olarak tek sıralı bir tablo kullanacak, ancak bir SIRALAMA değer üreteci olarak aynı tam karakteristiklere sahip olacaktır (yani, her zaman ayrı bir işlemde sekans tablosuyla ilgilenir) ”.
- org.hibernate.id.enhanced.TableGenerator
özellikle taşınabilirlik hedefleme olmasa da, TableGenerator kesinlikle tüm veritabanları arasında kullanılabilir. Satırların bir (yapılandırılabilir) sequence_name sütunu tarafından girildiği çok satırlı bir tablo kullanır; Bir yaklaşım, her bir varlığın tanımlayıcı değerlerini bölümlere ayırmak için tabloda benzersiz bir sekans_adı değeri tanımlamasını sağlamak olacaktır. Eski org.hibernate.id.MultipleHiLoPerTableGenerator'dan çıktı ve temelde aynı tablo yapısını kullanır. Bununla birlikte, MultipleHiLoPerTableGenerator, doğal olarak değer üretimine bir hi-lo algoritması uygularken, takılabilir optimize edicilerden yararlanabilmek için bu yeni TableGenerator eklenmiştir.
Örnek Varlık Tüm veritabanlarında hangi kullanım, Hazırda Bekletme Sırası.
@Entity
@Table(name = "author")
public class Author implements java.io.Serializable {
// Fields
private Integer id;
private String name;
private Date birthDate;
private Date deathDate;
private String bio;
private String wikiUrl;
private String imagePath;
private Boolean isFeatured;
private Long totalContent;
private Set<Content> contents = new HashSet<Content>(0);
// Constructors
/** default constructor */
public Author() {
}
// Property accessors
@Id
@GeneratedValue(generator = "Author_SequenceStyleGenerator")
@GenericGenerator(name = "Author_SequenceStyleGenerator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "Author_SEQ"),
@Parameter(name = "optimizer", value = "hilo"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "1") }
)
@Column(name = "id", unique = true, nullable = false, length = 11)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "name", length = 50)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Temporal(TemporalType.DATE)
@Column(name = "birth_date", length = 10)
public Date getBirthDate() {
return this.birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Temporal(TemporalType.DATE)
@Column(name = "death_date", length = 10)
public Date getDeathDate() {
return this.deathDate;
}
public void setDeathDate(Date deathDate) {
this.deathDate = deathDate;
}
@Column(name = "bio", length = 65535)
public String getBio() {
return this.bio;
}
public void setBio(String bio) {
this.bio = bio;
}
@Column(name = "wiki_url", length = 128)
public String getWikiUrl() {
return this.wikiUrl;
}
public void setWikiUrl(String wikiUrl) {
this.wikiUrl = wikiUrl;
}
@Column(name = "image_path", length = 50)
public String getImagePath() {
return this.imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
@Column(name = "is_featured")
public Boolean getIsFeatured() {
return this.isFeatured;
}
public void setIsFeatured(Boolean isFeatured) {
this.isFeatured = isFeatured;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "author")
public Set<Content> getContents() {
return this.contents;
}
public void setContents(Set<Content> contents) {
this.contents = contents;
}
@Transient
public Long getTotalContent() {
return totalContent;
}
public void setTotalContent(Long totalContent) {
this.totalContent = totalContent;
}
}
}
açıkça her varlık için sırasını belirtme için tek nedeni dizileri desteklemeyen veritabanları üzerinde DDL kullanmak isteyen varsa, bu sizin için bir çözüm olabilir:
@Id
@SequenceGenerator(name = "your_table_id_seq", sequenceName = "your_table_id_seq")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "your_table_id_seq")
@Column(name = "your_table_id")
public Long getId() {
return id;
}
budur Veri tabanları ile çalışacak sekanslar (AUTO stratejisi).
- 1. Tüm hazırda bekletme denetimleri için yalnızca bir tablo kullanabilir miyim?
- 2. Her sıra ayrı ayrı keskin mi?
- 3. Hazırda bekletme bileşenlerini ayrı bir tabloya eşleme
- 4. Hazırda bulunmak için Hazırda Bekletme enstrümantasyonunu oluşturma
- 5. Ehcache Hazırda Bekletme Bir tabloda yalnızca bir tablo için çalışıyor
- 6. DashDB - Hazırda bekletme ile yabancı anahtar oluşturmak için sorunlar
- 7. Cychon dosyalarını otomatik olarak derlemek için pydev'i yapılandırabilir miyim?
- 8. Hazırda Bekletme -
- 9. SessionFactory otomatik olarak oluşturmak için tarama paketlerini hazırda bekletebilir mi?
- 10. Hazırda bekletme yığın boyutunu programlı olarak değiştirme
- 11. Karmaşık bağlantılar için hazırda bekletme
- 12. Hazırda Bekletme (JPA) kullanarak Postgresql sorgusu Tablo
- 13. hangi adlandırma stratejisinin varsayılan olarak hazırda bekletilmesi
- 14. Hazırda bekletme: Bir tablo olmadan alanından bir sınıf yükleme
- 15. Hazırda bekletme ile çalışma Hazırda bekletme durumunu öğrenmek için
- 16. IllegalArgumentException: Hazırda bekletme türü uyuşmazlığı Hazırda bekletme
- 17. xsd.exe sınıfları ayrı dosyalar olarak oluşturmak için?
- 18. Sekmeleri boşluklara otomatik olarak dönüştürmek için IDLE öğesini yapılandırabilir miyim?
- 19. Hazırda Kümelenmiş Yapılandırmada Hazırda Bekletme?
- 20. Sonuçları Hazırda bekletme değerine göre ayarlama Hazırda bekletme
- 21. Her bir kategori ile SSRS raporu ayrı bir tablo/kılavuz
- 22. Hazırda bekletme modundan yapılandırma EntityManagerFactory Yapılandırma
- 23. Hazırda bekletme, JPA'dan hazırda bekletme modunu nasıl başlatılır?
- 24. Hazırda Bekletme dizisi
- 25. Hazırda Bekletme durumu
- 26. JPA için Hazırda Bekletme Sorguları
- 27. Hazırda Bekletme Süresi Hazırda Beklemede
- 28. Alt sınıflarda Hazırda Bekleme alt tablosundaki tablo başına ayrı sıralama belirtme
- 29. org.hibernate.LazyInitializationException (İlkbahar/Hazırda Bekletme)
- 30. Annotaion ile hazırda bekletme
Bu gönderideki başlangıç açıklaması, http://in.relation.to/2082.lace adresinde bu özellik hakkında blog yazan orijinal kod yazarı Steve Ebersole'den bir kesme ve yapıştırmadır. Daha fazla bilgi için bakın. –
Evet, açıklama hazırda beklemede olan resmi belgeden alınmıştır. –