4

私はHibernate4.0.1.Finalを使用しています。一意の制約列を持つテーブルがあります…</p>

@Entity
@Table(name = "cb_contract",
    uniqueConstraints = {@UniqueConstraint(columnNames={"ORDER_ID"})}
)
public class Contract {
    ... 
    @Column(name = "ORDER_ID")
    private String orderId;

現在、以下の方法を使用して、注文ID列に同じ値を持つ2つのオブジェクトを保存しようとすると...

protected void saveOrUpdate(Object obj) {
    final Session session = sessionFactory.getCurrentSession();
    session.saveOrUpdate(obj);
}

2番目のインスタンスを保存すると、「org.hibernate.exception.ConstraintViolationException:整合性制約違反:一意の制約またはインデックス違反」例外が発生します。一意の列に基づいてHibernateにオブジェクトを保存または置換させる方法はありますか、または最初にオブジェクトを検索し、オブジェクトが存在する場合は削除してから、再挿入する必要がありますか?

4

1 に答える 1

2

あなたは正しいと思いますが、あなたがやろうとしていることに最も近いものがここに文書化されています-HibernateはMySQLの "ON DUPLICATE KEY UPDATE"構文で動作しますか?

何をしようとしているのかにもよりますが、同じキー/制約を持つレコードがすでに存在する場合は、既存のレコードを上書きしてもかまわないのではないかと心配しています。

一意の制約を完全に削除し、代わりにそのorderIdのIDが最大の制約を取得したいと思います。そうすれば、少なくともそのorderIdを持つすべてのコントラクトのバックアップコピーを保持できます。ただし、これはメモリスペースでは明らかに効率が低くなります。

于 2012-06-26T20:11:24.810 に答える