gpt4 book ai didi

Spring + JPA 多对多关系

转载 作者:行者123 更新时间:2023-12-04 12:42:45 25 4
gpt4 key购买 nike

我对 Spring 非常陌生,我正在努力使多对多关系按预期工作。关系工作正常,创建了表并正确插入了数据。我期望的是,当我清空列表时(即我从“组”类型的对象中清空 ArrayList“用户”),我希望系统从数据库中删除关系 - 但它没有。

我有以下类(class):

@Entity
@Table(name = "`group`")
public class Group
{
@Id
@GeneratedValue
@Column(name = "id")
private int id;

@Column(name = "name")
private String name;

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(
name = "`user_has_group`",
joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
)
private List<User> users = new ArrayList<User>();

...
}

@Entity
@Table(name = "`user`")
public class User
{
@Id
@GeneratedValue
@Column(name = "id")
private int id;

@Column(name = "name")
private String name;

@ManyToMany(mappedBy = "users")
private List<Group> groups = new ArrayList<Group>();

...
}

以下是 DAO:
@Repository
public class GroupJpaDao implements GroupDao
{
private EntityManager em;

@Transactional
public void save(Group group)
{
this.em.merge(group);
}

...

@PersistenceContext
void setEntityManager(EntityManager entityManager)
{
this.em = entityManager;
}
}

@Repository
public class UserJpaDao implements UserDao
{
private EntityManager em;

@Transactional
public void save(User user)
{
this.em.merge(user);
}

...

@PersistenceContext
void setEntityManager(EntityManager entityManager)
{
this.em = entityManager;
}
}

下面是测试方法:
@Test
public void test()
{
Group g = new Group();
g.setName("Test group");
groupDao.save(g); // Works fine - inserts the group into the database

User u = new User();
u.setName("Test user");
userDao.save(u); // Works fine - inserts the user into the database

g.addUser(u);
groupDao.save(g); // Works fine - adds the many-to-many relationship into the database

g.removeAllUsers();
groupDao.save(g); // Doesn't work - I'm expecting it to remove all the related relationships from the database but it doesn't!
}

我做错了什么还是不可能做的事情?

任何提示都非常感谢。

谢谢!

最佳答案

我重读了你的问题,现在答案很清楚了。您创建一个群组 g ,并保存。但是由于您的保存方法使用 merge ,并且您没有考虑 merge 返回的值将其分配给 g ,您不断合并从未分配任何 ID 的 transient 组 g。因此,每次调用合并时,您实际上创建了一个新组,而不是修改先前创建的组。

将保存方法更改为

public Group save(Group group)
{
return this.em.merge(group);
}

并始终将结果重新分配给 g :
g = groupDao.save(g);

当然,用户也必须这样做。

关于Spring + JPA 多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8839630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com