3

次のようなエンティティがあります。

@Entity
@Table( name="marchi", uniqueConstraints=@UniqueConstraint(columnNames="codice") )
public class Marchio implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private String codice;

    private String nome;
//...
}

codeice = 123 でMarchioを作成し、それを永続化します。わかった!

次に、クエリを介してDBから取得し、「nome」プロパティを何かで編集して、merge()を呼び出します。わかった!

次に、 codice = 123 で別のMarchioを作成します。nomeに何かを入れて、merge()を呼び出します。

結果は次のとおりです。

ConstraintViolationException: キー「コード」のエントリ「123」が重複しています

いいですね、実際には最初の方法を使用できます: クエリ、プロパティ名の編集、およびマージ

私は「名前」しか持っていないと考えてください。私は35の異なるプロパティを持っているので、次のことはしたくありません:

Marchio m = em.findCodice("123");
m.setP1("1");
m.setP2("2");
...
m.setPN("N");
em.merge(m); 

どのようにできるのか?

4

4 に答える 4

3

私がよく理解していれば、更新された値を持つデタッチされたオブジェクトが既にあり、データベースから対応するオブジェクトを取得して、多くの set メソッドを呼び出して更新したくないでしょう。これを実現する唯一の方法は、古いオブジェクトを削除してから、切り離された新しいオブジェクトを永続化することです。

em.remove(oldobj);
em.persist(newobj);
于 2013-01-08T08:16:55.113 に答える
-1

これを試して:

@Table(name = "marchi", uniqueConstraints={@UniqueConstraint(columnNames="codice"), @UniqueConstraint(columnNames="nome")})

I believe with the above you can have:

codice nome
123     A
123     B
123     C
于 2013-01-04T16:36:56.313 に答える