2011-07-09 16 views
6

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

4

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; 
} 

} 
} 
+2

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. –

+0

Evet, açıklama hazırda beklemede olan resmi belgeden alınmıştır. –

2

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).

İlgili konular