Hibernateはトランザクションメソッドで変更されたエンティティを持続しますが、セッション#evict(エンティティ)を使用することで回避できます。Hibernateの永続コンテキストからエンティティ内のエンティティをデタッチ
永続コンテキストからデタッチすると、そのエンティティもデタッチされますか?アドレスは、トランザクションの終了時に保持されます、私はユーザーオブジェクトを切り離す場合
@Entity
public class User extends BaseEntity{
@Column(name = "email")
private String email;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<Address> addresses;
// getters and setters
}
@Entity
public class Address extends BaseEntity{
@Column(name = "email")
private String email;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private User user;
// getters and setters
}
が、それにアドレスオブジェクトを変更します。たとえば
、私はこのクラスを持っていますか?このように:
User user = userDAO.getById(id);
session.evict(user);
Address address = user.getAddresses().get(0);
address.setNumber(number);
addressDAO.saveOrUpdate(address); //will this work?
なぜ(明示的に)ユーザーを切り離したいですか? JPAは、ロードされたすべてのエンティティのコピーをメモリに保持します。トランザクションがコミットすると、永続コンテキストが実行され、変更されたエンティティが検出されます。この方法では、ユーザーを変更しない限り、ユーザーには何も起こりません。 –
私はユーザーを変更する行を省略しました。おそらく例で追加する必要があります。しかし、私は一括更新を行っているので、私はそれを切り離しているので、私は各エンティティを個別に保存したくありません。 –
'' 'CascadeType.DETACH/ALL'''が伝播しない限り、個々のエンティティごとにデタッチが行われます。アドレス変更がデータベースに届くようにsaveOrUpdate()で十分でなければなりません(ただし、JPAのように動作する場合は必須ではありません。しかし、CascadeType.UPDATEを持つエンティティを更新すると、これは分離されたエンティティに伝播するというトラブルにつながる可能性があります。 *一括更新*とはどういう意味ですか?私は500MBのサイズの取引をしており、切り離す必要はありませんでした。 –