从我看来,一对多的联系
User
Friendship
是双向的,但您的映射不能反映这一点。你能先把地图修好吗?像这样:
@Entity
public class User1 {
@Id @GeneratedValue
private Long id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,
mappedBy = "user1")
private List<Friendship> friends = new ArrayList<Friendship>();
public int friendsCount;
// omitting getters, setters for brevity
public void incrementFriendsCount() {
friendsCount++;
}
public void addToFriends(Friendship friend) {
this.getFriends().add(friend);
friend.setUser1(this);
}
}
-
mappedBy
-
我添加了一个方便的方法,在添加链接时正确设置链接的两侧
友谊
实体侦听器被调用,它修改用户,但此时Hibernate已经确定它不必担心用户,因此它不更新用户。
你的
MyBrokenEntityListener
用户
实例在侦听器调用后已过时,它确实会触发更新。以下测试方法(在事务内运行)通过:
@Test
public void testPostPersistInvocationOnAddFriend() {
User1 user = new User1();
Friendship friend1 = new Friendship();
user.addToFriends(friend1);
em.persist(user);
em.flush();
assertEquals(1, user.getFriendsCount());
Friendship friend2 = new Friendship();
user.addToFriends(friend2);
em.flush();
em.clear(); // so that we reload the managed user from the db
user = em.find(User1.class, user.getId());
assertEquals(2, user.getFriendsCount());
}