加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Spring JPA有很多很多关系

发布时间:2020-12-15 01:30:49 所属栏目:大数据 来源:网络整理
导读:我是Spring的新手,我正在尝试按照我的预期建立多对多的关系.关系工作正常,创建表并正确插入数据.我期望的是,当我清空List(即我从“Group”类型的对象中清空ArrayList“users”)时,我希望系统从数据库中删除关系 但事实并非如此. 我有以下课程: @Entity@Tabl

我是Spring的新手,我正在尝试按照我的预期建立多对多的关系.关系工作正常,创建表并正确插入数据.我期望的是,当我清空List(即我从“Group”类型的对象中清空ArrayList“users”)时,我希望系统从数据库中删除关系 – 但事实并非如此.

我有以下课程:

@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

以下是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,并保存它.但由于您的保存方法使用合并,并且您没有考虑合并返回的值以将其分配给g,因此您将继续合并瞬态组g,该组永远不会分配任何ID.因此,每次调用merge时,实际上都会创建一个新组,而不是修改先前创建的组.

将保存方法更改为

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

并始终将结果重新分配给g:

g = groupDao.save(g);

当然,必须为用户做同样的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读