gpt4 book ai didi

java - Hibernate 多对多级联保存与连接表

转载 作者:行者123 更新时间:2023-11-30 06:34:12 26 4
gpt4 key购买 nike

如果可能的话,这就是我正在努力实现的目标。我正在尝试使用级联将以下对象保存到数据库中。

这是我遇到的问题的简化示例。我认为它工作的方式是 hibernate 应该按顺序插入“用户”然后“组”然后“用户组”,但发生的情况是它插入“用户”然后“用户组”这会导致“对象引用未保存的 transient 实例” “下面的日志中出现组错误。

显然,使用自己的 save() 调用来保存单个对象是可行的,但真实的数据库比这大得多,我宁愿避免这种情况。

下面的“TestCode”复制了数据如何传入我的,它是从 JSON 数据反序列化的。

我怀疑这与我的映射有关,但我无法查明原因。

作为引用,我使用的是 Hibernate 5.2.10.Final。

那么我错过了什么?

DB Diagram

用户.java

@Entity
@Table(name = "User")
public class User implements java.io.Serializable {

private static final long serialVersionUID = -7899020279254796671L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userID", unique = true, nullable = false)
private int userId;

@Column(name = "name", nullable = false, length = 45)
private String name;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL,mappedBy = "id.user")
private Set<UserGroup> userGroups = new HashSet<UserGroup>(0);
//Getters, setters, etc...
}

Group.java

@Entity
@Table(name = "Group")
public class Group implements java.io.Serializable {

private static final long serialVersionUID = 4428563096071107683L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "groupID", unique = true, nullable = false)
private int groupId;

@Column(name = "name", nullable = false, length = 45)
private String name;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL,mappedBy = "id.group")
private Set<UserGroup> userGroups = new HashSet<UserGroup>(0);
}

用户组.java

@Entity
@Table(name = "UserGroup")
public class UserGroup implements java.io.Serializable {

private static final long serialVersionUID = 5495027289164828327L;

@EmbeddedId
private UserGroupId id;

@Column(name = "defaultGroup")
private Boolean defaultGroup;
}

UserGroupdId.java

@Embeddable
public class UserGroupId implements java.io.Serializable {

private static final long serialVersionUID = -3806643465171954306L;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "groupID", nullable = false, insertable = false, updatable = false)
private Group group;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "userID", nullable = false, insertable = false, updatable = false)
private User user;
}

测试代码

User u = new User();
u.setName("User");

Group g = new Group();
g.setName("Group");


UserGroup ug = new UserGroup();
UserGroupId id = new UserGroupId();
ug.setId(id);
ug.getId().setGroup(g);
ug.getId().setUser(u);

ug.setDefaultGroup(false);
u.getUserGroups().add(ug);


session.saveOrUpdate(u);

日志条目

[DEBUG] 2017-08-03 10:19:43.497 [main] SQL - insert into M2M.User (name) values (?)
[DEBUG] 2017-08-03 10:19:43.497 [main] SQL - insert into M2M.User (name) values (?)
[TRACE] 2017-08-03 10:19:43.510 [main] BasicBinder - binding parameter [1] as [VARCHAR] - [User]
[TRACE] 2017-08-03 10:19:43.510 [main] BasicBinder - binding parameter [1] as [VARCHAR] - [User]
[DEBUG] 2017-08-03 10:19:43.541 [main] IdentifierGeneratorHelper - Natively generated identity: 65
[DEBUG] 2017-08-03 10:19:43.541 [main] ResourceRegistryStandardImpl - HHH000387: ResultSet's statement was not registered
[DEBUG] 2017-08-03 10:19:43.546 [main] SQL - select usergroup_.groupID, usergroup_.userID, usergroup_.defaultGroup as defaultG1_2_ from M2M.UserGroup usergroup_ where usergroup_.groupID=? and usergroup_.userID=?
[DEBUG] 2017-08-03 10:19:43.546 [main] SQL - select usergroup_.groupID, usergroup_.userID, usergroup_.defaultGroup as defaultG1_2_ from M2M.UserGroup usergroup_ where usergroup_.groupID=? and usergroup_.userID=?
[ERROR] 2017-08-03 10:19:43.546 [main] M2MTest - org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: m2m.Group

最佳答案

@ManyToOne 级联是没有意义的协会。

此外,级联多对多关联的 REMOVE 操作也没有任何意义,因为两个映射实体都是父实体,而连接表是该关联中的子实体。

所以,你有两个选择:

  1. 如果您想映射join table ,需要分别保存UserGroup,并在设置关联双方时级联到UserGroup
  2. 您可以跳过映射连接表,级联将按您的预期工作。但是,请确保您使用 Set映射集合关联时而不是 List

关于java - Hibernate 多对多级联保存与连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45490536/

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