4

私はすでに解決した問題に直面しましたが、その理由はまだ説明できません。デタッチ状態でのオブジェクトの変更に関連する問題。

私が持っているもの:

人 -> (1-2-many) -> 住所。Person にはアドレスの遅延リストがあります ( orphanRemoval = true )。

何の問題:

切り離された状態で人のアドレスをクリアすると、その人を新しいセッションに再アタッチし、更新してコミットした後でも、古いアドレスがDBに残っています。しかし、すべての作品をマージした後は楽しいです。

質問は何ですか:

update(person )と比較して、merge(person) の変更点は何ですか?

私がやること:

最初のセッションでは:

person.setAddresses(addressesList);
transaction1.commit();
session1.close():

切り離された状態:

person.getAddresses().clear(); //addresses collection declares with orphanRemoval = true option. So all addresses should be deleted after collection is clear. Is it true in detached state? 

2 番目のセッションでは:

session2.update(person); //Person person2= (Person)session.merge(person);  - solve the problem
person.getAddresses().add(newAdress);
transaction2.commit();
session2.close();

添加:

「セッションに同じ識別子を持つ永続的なインスタンスが含まれていないことが確実な場合は、update() を使用します。セッションの状態を考慮せずにいつでも変更をマージする場合は、merge() を使用します。つまり、 、update() は通常、新しいセッションで呼び出す最初のメソッドであり、デタッチされたインスタンスの再アタッチが実行される最初の操作であることを保証します。」(c)ドキュメントから。

しかし、私の session2 は新鮮です。そのような場合、merge() メソッドはどのように変更される可能性がありますか?

ソースコード:

@Entity
@Table(name = "person")
public class Person{
    @Id
    @SequenceGenerator(name = "person_sequence", sequenceName = "sq_person")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence")
    @Column(name = "id")
    private int id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @JoinColumn(name = "person_id")
    private List<FileInfo> files;
    //getter & setter
}

@Entity
@Table(name = "address")
@Inheritance(strategy= InheritanceType.JOINED)
public class Address {
    @Id
    @SequenceGenerator(name = "adress_sequence", sequenceName = "sq_adress")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "address_sequence")
    @Column(name = "id")
    private long adressID;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "person_id")
    private Person person;
}
4

0 に答える 0