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);
}