Java 休眠单向@ManyToMany

Java 休眠单向@ManyToMany,java,hibernate,many-to-many,Java,Hibernate,Many To Many,我在帐户和组之间存在多对多关系。groups表的数据是预先填充的,不需要添加其他组 使用Hibernate,我的愿望是: 将帐户添加到帐户表中 将记录添加到account_group表中,然后 不将记录添加到组表中 在我看来,无论我做什么,我总是在组表中得到一个重复的记录。这是我的问题。这是我的密码: Account.java AccountDao.java @存储库 公共类AccountDao扩展了AbstractJpaDao{ ... @交易的 公共布尔创建(帐户newAccount){ 试

我在帐户和组之间存在多对多关系。groups表的数据是预先填充的,不需要添加其他组

使用Hibernate,我的愿望是:

  • 将帐户添加到帐户表中
  • 将记录添加到account_group表中,然后
  • 将记录添加到组表中
  • 在我看来,无论我做什么,我总是在组表中得到一个重复的记录。这是我的问题。这是我的密码:

    Account.java

    AccountDao.java

    @存储库
    公共类AccountDao扩展了AbstractJpaDao{
    ...
    @交易的
    公共布尔创建(帐户newAccount){
    试一试{
    getEntityManager().merge(新帐户);
    返回true;
    }捕获(例外e){
    System.out.println(“危险,威尔·罗宾逊!:”+e);
    返回false;
    }
    }
    }
    

    我已经查阅了很多关于Hibernate@manytomy的问题和网站,但我肯定遗漏了一些东西。感谢您的阅读和帮助。

    不幸的是,我没有足够的代表发表评论,所以我将给出我的猜测作为答案。在保存实体之前,请确保在为您的帐户选择组时,该组实体具有ID。否则,组实体将被视为一个新对象,并将保存到分组表中。

    既然您确实不想添加或更新新组,为什么要对合并和持久化进行级联?去掉那个。然后在保存之前发布实际创建帐户并向其中添加组的代码。如果未指定任何级联类型,则会出现以下错误:
    托管刷新期间出错[org.hibernate.transientObject异常:对象引用未保存的临时实例-在查询刷新之前保存临时实例
    我应该提到Jackson正在从前端序列化JSON响应,该响应将成为上面的newAccount变量。JSON中的groupings变量如下所示:
    groupings:[{name:“groupa”,groupType:“typea”}]
    这个错误是一个非常强烈的提示。它告诉您:“您正在将一个新的非持久组保存为帐户的一部分"。您确实不希望这样。通过添加级联,您可以使Hibernate在保存帐户时保存此新组。处理此错误的正确方法是避免传递新组,而传递您想要的现有组。Hibernate使用I ID标识实体。您保存在帐户中的组没有任何。I feel愚蠢!就是这样!我只需要在发送到后端的JSON响应正文中包含组的id。因为您是第一个发布解决方案的人,如果您将解决方案发布为答案,我会将其标记为正确答案。
    @Entity
    @Table(name = "account", schema = "admin")
    public class Account {
    
        @Id
        @GeneratedValue
        private UUID id;
    
    ...
    
        @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
        @JoinTable(name = "account_grouping", schema = "admin", joinColumns = @JoinColumn(name = "account_id"), inverseJoinColumns = @JoinColumn(name = "grouping_id"))
        private Set<Grouping> groupings;
    
    ...
    
        // getters and setters
    
    }
    
    @Entity
    @Table(name = "grouping", schema = "admin")
    public class Grouping {
    
    ...
    
        @Id
        @GeneratedValue
        private UUID id;
    
    ...
    
        // getters and setters
    
    }
    
    @Repository
    public class AccountDao extends AbstractJpaDao<Account, String> {
    
    ...
    
        @Transactional
        public boolean create(Account newAccount) {
            try {
                getEntityManager().merge(newAccount);
                return true;
            } catch(Exception e) {
                System.out.println("Danger, Will Robinson!: " + e);
                return false;
            }
        }
    
    }