我在驱逐实体时遇到问题,但对其所做的更改仍会更改数据库。这是我的 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 中的原始行现在有一个空外键。
为什么?这发生在使用 Unitils 和 Spring 的单元/集成测试中,这可能会影响 Hibernate DAO 的工作方式。
这一切都在内存中的 H2 数据库中。
添加一行后
profile.setAvatars(new ArrayList<>(profile.getAvatars());
有用 ...
所以我猜问题是 Hibernate 的实现List
,但这怎么会影响行为呢?