Hibernate 多个关联删除联接表项
我使用这两个实体创建新用户及其关联的组:Hibernate 多个关联删除联接表项,hibernate,spring,many-to-many,Hibernate,Spring,Many To Many,我使用这两个实体创建新用户及其关联的组: @Entity @Table(name="usertable") @SuppressWarnings("serial") @Searchable public class User implements Serializable { @GeneratedValue(generator="userIdSeq") @SequenceGenerator(name="userIdSeq", sequenceName="u
@Entity
@Table(name="usertable")
@SuppressWarnings("serial")
@Searchable
public class User implements Serializable {
@GeneratedValue(generator="userIdSeq")
@SequenceGenerator(name="userIdSeq", sequenceName="usertable_id_seq")
@SearchableId
@Id
int id;
@SearchableProperty
String userId; // 'Unique identifier. It is formed using this fashion: ''prefix:identifier''
String userName; // Name used to log in the application.
String email; // User's email
@ManyToMany
@JoinTable( name="usergroup",
joinColumns=@JoinColumn(name = "userid", referencedColumnName="userId"),
inverseJoinColumns=@JoinColumn(name = "groupid")
)
List<Group> groups;
...
}
// Group
@Entity
@Table(name="grouptable")
public class Group implements Serializable {
@Id
String groupId // Unique identifier for group.
String description // Brief text describing the group purposes.
@ManyToMany(mappedBy="groups")
@Cascade(SAVE_UPDATE)
List<User> users
....
}
有几件事我需要注意;
1.userid不是用户对象的主键。这就是问题所在吗?
2.用户组中由userid和groupid映射的多个映射
3.这不仅仅发生在测试中。它也在开发中
如何停止自动删除用户组。用户组是非常重要的表,不应删除。任何帮助都将不胜感激。谢谢。让我们看看用户
public class User {
@Id
@GeneratedValue
private Integer id;
@ManyToMany
@JoinTable(name="USER_GROUP",
joinColumns=@JoinColumn(name="USER_ID", referencedColumnName="USER_ID"),
inverseJoinColumns=@JoinColumn(name="GROUP_ID")
)
private List<Group> groupList = new ArrayList<Group>();
}
在createUser方法中,您具有与上面所示相同的场景
所以我的建议是
使用双向关系时,请始终使用添加便利方法
尊敬,@JohnnyBeGood除非您出示您的测试用例,否则我们无法帮助您。@Arthur感谢您的回复。添加了测试用例。如果我能澄清任何其他问题,请告诉我。我也尝试了不同的@Casade选项。再次感谢。您是新用户。欢迎您,但如果您看到有用的答案,请向上投票。谢谢。我想你没有回答他的问题:为什么发出删除命令?如何避免删除oposite表(而不是连接表)?
private User createUser(){
Session session = factory.getCurrentSession();
String userId = "UB:2010";
String userPassword = "sarah";
String realName = "Sarah Silverman";
String email = "sarah.silverman@comedycentral.com";
User user = new User();
user.setUserId(userId);
user.setUserName(email);
user.setUserPassword(userPassword);
user.setRealName(realName);
user.setEmail(email);
List<Group> emptyGroupLists = new ArrayList<Group>();
user.setGroupLists(emptyGroupLists);
Group group = new Group();
group.setGroupId("ABC");
group.setDescription("A for apple");
user.getGroupLists().add(group);
session.save(group);
session.save(user);
session.flush();
return user;
}
// Repository Method to get user from email
//
// @NamedQuery(name="user.findByEmail",
// query="SELECT u FROM User u " +
// "LEFT JOIN FETCH u.groupLists " +
// "WHERE upper(u.email) = :email")
public User getUserByEmail(String email) {
Session session = sessionFactory.getCurrentSession();
Query query = session.getNamedQuery("user.findByEmail");
query.setParameter("email", email.toUpperCase());
User user = (User)query.uniqueResult();
return user;
}
Hibernate:
delete
from
usergroup
where
userid=?
public class User {
@Id
@GeneratedValue
private Integer id;
@ManyToMany
@JoinTable(name="USER_GROUP",
joinColumns=@JoinColumn(name="USER_ID", referencedColumnName="USER_ID"),
inverseJoinColumns=@JoinColumn(name="GROUP_ID")
)
private List<Group> groupList = new ArrayList<Group>();
}
public class Group {
@Id
private String id;
@ManyToMany(mappedBy="groupList")
@Cascade(SAVE_UPDATE)
private List<User> userList = new ArrayList<User>();
}
// Group.java
@ManyToMany(mappedBy="groupList")
@Cascade(SAVE_UPDATE)
private List<User> userList = new ArrayList<User>();
Group group = new Group();
group.setId(groupId);
// group.getUserList(); returns a empty List, right ?
// As there is no User with reference to group in group.getUserList();
// So NO LINK between Group and User through USER_GROUP table
session.save(group);
// It explains why your link is missing
// You need to set up both sides
user.getGroupLists().add(group);
// Just save a User
// Nothing else
session.saveOrUpdate(user);
// Group.java
public void addUser(User user) {
user.getGroupList().add(this);
getUserList().add(user);
}
// User.java
public void addGroup(Group group) {
group.getUserList().add(this);
getGroupList().add(group);
}