1

親エンティティ クライアントがあります。このクライアントは、Web サイトにアクセスして予定を作成できます。これは、クライアント オブジェクトとは別の時間に予定が作成されることを意味します。

私の質問は、既に永続化されている親オブジェクトに子オブジェクトをどのように追加するのですか? 以下の例の関数 addData1() が呼び出されると、Appointment テーブルが作成され、エントリが追加されます。関数 addData2() が呼び出されると、これは起こりません。

entitymanager を閉じた後に永続化されたオブジェクトを更新すると、これもテーブルで更新されるようになっていませんか?

@Entity
public class Client{
    @Id
    private String name;
    @OneToMany(cascade = CascadeType.ALL)
    private Set<Appointment> appointments;
}

@Entity
public class Appointment{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;
}

// This works
public function addData1(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
    em.persist(client);
    em.close();
}

// This doesn't work.
public function addData2(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    em.persist(client);
    em.close();
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
}
4

1 に答える 1

1
public function addData1(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
    em.persist(client);
    em.close();
}

この関数は、すべてのオブジェクトを永続化するために機能します。

// This doesn't work.
public function addData2(){
    EntityManager em = EMF.get().createEntityManager();
    Client client = new Client(name);
    em.persist(client);
    em.close();    <--- You persist client with no appointment
    for(Appointment a  : newAppointments)
        client.addAppointment(a);   <-- those entitys are detached entity ( not persisted)
}

デタッチされたエンティティでオブジェクトを永続化しようとするため、この関数は機能しません

次のような例外が発生するはずです。

Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.test.Appointment

この例外を回避したい場合は、次のアプローチを試すことができます。

public void addData2(List<Appointment> newAppointments){
    Client client = new Client();
    client.setName("name1");
    entityManager.persist(client);
    for(Appointment a  : newAppointments)
        client.addAppointment(a);
    entityManager.merge(client);
    entityManager.close();
}

ところで、ID として名前を使用して無効にしてみてください

于 2012-11-29T02:23:47.043 に答える