1

次のコードを使用していますが、テーブルからエントリを読み取ると(derby db --eclipse link)、エントリは1つだけですが、新しいエントリを追加するにはどうすればよいですか?たとえば、同じエントリを5回追加するには?

for (Object object : listClsObj) {
    int cnt = 1;
    do {
        em.getTransaction().begin();
        em.persist(object);
        em.getTransaction().commit();
        cnt++;
    }
    while (cnt < 6);
        }
em.close();

エンティティクラスは次のとおりです。

@Entity
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private String id;
private String firstName;
private String lastName;

public String getId() {

    return id;
}

public void setId(String Id) {

    this.id = Id;
}

public String getFirstName() {

    return firstName;
}

em persistにブレークポイントを設定し、2番目のループでid値を変更すると、次のエラーが発生しました。

例外の説明:クラス[DerbyModel.Person]の属性[id]は、データベースの主キー列にマップされています。更新は許可されていません。スレッド"main"の例外javax.persistence.RollbackException:例外[EclipseLink-7251](Eclipse Persistence Services-2.4.1.v20121003-ad44345):org.eclipse.persistence.exceptions.ValidationException例外の説明:の属性[id]クラス[DerbyModel.Person]は、データベースの主キー列にマップされます。更新は許可されていません。

4

1 に答える 1

1

を呼び出すときem.persist(object)、によって参照されるインスタンスobjectはおそらくdbmsによって割り当てられid、jpaセッションに接続されたままになります。これは、インスタンスobjectが参照しているものがすでに永続化されており、以降の呼び出しは、インスタンスをpersist再度永続化しようとする以外に何もしないことを意味します(同じID、同じ値)。

おそらくPerson、ループを実行するたびにの新しいインスタンスを作成し、それぞれを永続化するか、インスタンスを(たとえば、を使用してem.detach())切り離してそのIDをリセットする必要があります。

テストされていないサンプル:

for (Object object : listClsObj) {
    int cnt = 1;
    do {
        em.getTransaction().begin();
        em.persist(object);
        em.getTransaction().commit();
        em.detach(object);
        ((Person)object).setId(null);
        cnt++;
    }
    while (cnt < 6);
        }
em.close();
于 2013-01-24T10:20:47.580 に答える