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