IT干货网

Spring + JPA 多对多关系

sky-heaven 2025年02月15日 编程设计 14 0

我对 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); 

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!