エンティティを削除するという問題がありますが、それを変更するとデータベースが変更されます。これは私の DAO のメソッドの一部です。
@Entity
public class Profile {
@Id
@GeneratedValue
private Long id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "PROFILE_ID")
@LazyCollection(LazyCollectionOption.FALSE)
private List<Avatar> avatars;
...
}
DAO メソッドの場合:
Profile profile = getProfile(...);
// Clear from hibernate
currentSession.evict(profile);
profile.setId(null);
for (Avatar a : profile.getAvatars()) {
currentSession.evict(a);
a.setId(null);
}
currentSession.save(profile); // save a copy of Profile (not update)
前:
PUBLIC.PROFILE
ID, DOMAIN, STATUS
1, "test", "MEMBER"
PUBLIC.AVATAR
ID, NAME, PROFILE_ID
1, "main", 1
メソッドの後
PUBLIC.PROFILE
ID, DOMAIN, STATUS
1, "test", "MEMBER"
2, "test", "MEMBER"
PUBLIC.AVATAR
ID, NAME, PROFILE_ID
1, "main", null
2, "main", 2
ご覧のとおり、AVATAR の元の行には null の外部キーが含まれています。
なんで?これは、Unitils と Spring を使用したユニット/統合テストで発生しており、 Hibernate DAO の動作に影響を与える可能性があります。
それはすべてインメモリ H2 データベースにあります..
行を追加した後
profile.setAvatars(new ArrayList<>(profile.getAvatars());
できます ...
だから、問題は Hibernate の の実装だったと思いますがList
、それが動作にどのように影響するのでしょうか??