2011-05-15 17 views
1

ユニーク制約 problem休止状態私は以下の問題に直面しました

P:Sは、上記のリンク

上commnets :)を見て、それを解決しながら、私は今、どのようにについて質問があります固有の制約がhibernateで実装されているため、選択クエリ(私はこれについてはわかりません)を起動し、次に「いくつかの方法」が検証を実行すると考え始めました。私が説明

答えて

4

Hibernateで非常に納得していないよ

は、その列の「ユニーク」のインデックスを作成し、それがその後、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; 
} 

Hibernateはそうのようなテーブルを作成します(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

)、それは私が制約を取り除いたときに発火しなかった、それについての何かの考え? – Sudarshan

+0

私はローカルでその動作を再現しようとしましたが、私は幸運を持っていません:(ユニークな制約があっても、新しいエンティティのためのまっすぐな挿入を行います)更新(when ...更新) – wmacura

0

私はこの動作を再現しようとしました。私はgrails 1.3.7を使用して再現可能であることを確認しました。

class Child { 
String name 
static constraints = { name(unique:true) } 
child.saveに発砲個の
table created 
CREATE TABLE `child` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`) 
) 

クエリ()

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 (?, ?, ?, ?, ?, ?) 

私は休止状態だと思う理由は、上記のクエリは、一意性制約をチェックすることです発射し、そして場合にアップデートを実行しようとしていますこのクエリはメモリ内に同じ識別子を持つ別のオブジェクトを持つことになり、非ユニークなオブジェクトの例外につながる可能性があります。

私はこれがハイバーネーションであり、grailsではないと考えています。これをjava/hibernateでダブルチェックしていません。私は、エンティティ(あなたが与えられたリンクのコメントを見てしかし、もし、あなたが、私が持っていたとき休止..上の固有の制約がsession.saveでクエリを発射していることがわかります、同じくらいと思っ

おかげ

+0

Can誰もがこの動作がgrailsに特有のものかどうかを確認していますが、@UniqueConstraintsを使用しても同様の動作をしません。 – Sudarshan

+2

Grailsに固有のものであり、非常に疑問もあります(SQLチェックとtxコミットの間に、 – Vincent