Q
冬眠唯一約束
1
A
回答
4
休眠創建該列有「獨特」的指標,它是那麼強制執行uniquness數據庫。
舉例來說,如果你有一個類:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserEmailAddressEntity {
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic(optional = false)
private boolean primaryEmail;
@ManyToOne(optional = false)
private UserEntity user;
@NaturalId // this means the email column must be unique
@Basic(optional = false)
private String email;
@Basic(optional = false)
private String token;
@Basic(optional = false)
private boolean verified;
}
休眠創建一個表像這樣:(PostgreSQL的,但這個想法是一樣的幾乎所有RDBMS)
CREATE TABLE useremailaddressentity
(
id bigint NOT NULL,
email character varying(255) NOT NULL,
primaryemail boolean NOT NULL,
token character varying(255) NOT NULL,
verified boolean NOT NULL,
user_id bigint NOT NULL,
CONSTRAINT useremailaddressentity_pkey PRIMARY KEY (id),
CONSTRAINT fk279a5e06c843ec30 FOREIGN KEY (user_id)
REFERENCES userentity (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
-- note the `UNIQUE` here:
CONSTRAINT useremailaddressentity_email_key UNIQUE (email)
)
0
我試圖複製這種行爲,我使用使用grails 1.3.7,並發現它是可重複的
class Child {
String name
static constraints = { name(unique:true) }
}
table created
CREATE TABLE `child` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
)
查詢上 child.save()發射
Hibernate: select this_.id as id0_0_, this_.version as version0_0_, this_.created_by as created3_0_0_, this_.date_created as date4_0_0_, this_.last_updated as last5_0_0_, this_.name as name0_0_, this_.updated_by as updated7_0_0_ from child this_ where this_.name=?
Hibernate: insert into child (version, created_by, date_created, last_updated, name, updated_by) values (?, ?, ?, ?, ?, ?)
究其原因,我想我休眠觸發以上查詢是檢查唯一約束,而如果你試圖執行更新那麼這個查詢將導致另一個在內存中具有相同標識符的對象,這可能導致非唯一性觀察。
我以爲這是hibernate而不是grails,沒有在java/hibernate中雙重檢查過這個。
感謝
相關問題
- 1. 空約束,許多冬眠
- 2. 唯一約束
- 3. 唯一約束Nhibernate
- 4. OpenERP唯一約束
- 5. oracle唯一約束
- 6. 唯一約束JayData
- 7. 唯一約束(SchemaName.DATA1_PK)
- 8. 唯一約束值
- 9. 唯一約束在NON-NULL列上的唯一約束
- 10. 唯一約束vs唯一索引
- 11. Oracle唯一約束和唯一索引
- 12. PostgreSQL的唯一約束不夠唯一
- 13. 外鍵約束孩子在一,在JPA的一個關係冬眠
- 14. DataTable上的唯一約束
- 15. XML模式唯一約束
- 16. JPA唯一約束驗證
- 17. Neo4JClient創建唯一約束
- 18. 笨ORA-00001:唯一約束
- 19. Postgres添加唯一約束
- 20. 唯一約束與預檢
- 21. 唯一約束性能
- 22. 多列唯一約束
- 23. 添加唯一約束列
- 24. 違反唯一鍵約束
- 25. Grails的唯一約束
- 26. 刪除唯一約束
- 27. 違反唯一約束?
- 28. 在唯一鍵約束
- 29. HABTM - 唯一性約束
- 30. 測試唯一約束
我認爲一樣多,但是如果你看給定鏈路上的評論,你會看到,當我有得天獨厚的約束..休眠被射擊session.save查詢(實體),當我刪除約束時,它不會觸發,對此有什麼想法? – Sudarshan 2011-05-15 13:51:24
我試圖在本地重新創建該行爲,但我沒有任何運氣,對不起:(即使有一個獨特的約束,它會直接插入(對於新實體)或更新(當...更新時) – wmacura 2011-05-15 23:37:44