2010-01-17 76 views
3

我用这两个实体创建一个新的用户和组它关联:多对多assoicate删除连接表项

@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", 
       [email protected](name = "userid", referencedColumnName="userId"), 
       [email protected](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 

    .... 
} 

在数据库: 用户表(ID,用户id,名) grouptable将(ID,描述) 用户组(用户ID,组识别,groupkey)

这是非常令人满意的组添加到组的列表,调用保存方法上的用户和togehter观看休眠保存usergoup。然而,当我在保存(用户)操作后检索用户时,我有一个休眠问题会自动从用户组表中自动删除条目。

下面是测试序列生成用户组

  1. 删除保存新的用户
  2. 保存新组
  3. 和组列出在用户
  4. 节省用户从
  5. 获得用户电子邮件
 
    @Test 
    @Transactional 
    public void testGetUserByEmail(){ 
     Session session = factory.getCurrentSession(); 

     String email = "[email protected]"; 
     User user = createUser(); 
     user.setWeCanContact(true); 
     user.setPartnersCanContact(false); 
     user.setAgreedTerms(false); 
     user.setReferer("Laura"); 

     String groupId = "AARP"; 
     String description = "Appletalk Address Resolution Protocol"; 
     Group group1 = new Group(); 
     group1.setGroupId(groupId); 
     group1.setDescription(description); 
     session.save(group1); 
     session.flush(); 
     user.getGroupLists().add(group1); 
     session.saveOrUpdate(user); 

     User testUser = userRepository.getUserByEmail(email); 
     assertNotNull(testUser); 
     assertEquals("It's not the correct email", email, testUser.getEmail()); 
    } 
private User createUser(){ 
     Session session = factory.getCurrentSession(); 
     String userId = "UB:2010"; 
     String userPassword = "sarah"; 
     String realName = "Sarah Silverman"; 
     String email = "[email protected]"; 

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

之前执行与像 // SQL输出

Hibernate: 
delete 
from 
usergroup 
where 
userid=? 

几件事我要注意自动删除步骤5中,用户组; 1.用户ID不是用户对象的PK。那会是问题吗? 2.由userrid和groupid映射的usergroup中的manyTomany映射 3.它不仅发生在Test中。它也在发展中。如何停止用户组的自动删除。用户组是非常重要的表格,不应该被删除。任何帮助将非常感激。谢谢。

+0

@JohnnyBeGood除非你显示你的测试情况下,我们不能帮你。 – 2010-01-17 15:52:00

+1

@Arthur非常感谢您的回复。测试用例已添加。请让我知道我是否可以澄清其他事情。我一直在尝试使用不同的@Casade选项。再次感谢。 – JohnnyBeGood 2010-01-17 20:35:35

+0

您是新用户。欢迎,但如果你看到有用的答案,UPvote。谢谢。 – 2010-01-17 23:50:20

回答

3

让我们来看看用户

public class User { 

    @Id 
    @GeneratedValue 
    private Integer id; 

    @ManyToMany 
    @JoinTable(name="USER_GROUP", 
     [email protected](name="USER_ID", referencedColumnName="USER_ID"), 
     [email protected](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>(); 

@Cascade(SAVE_UPDATE)用户列表字段表示

保存或更新每个被引用的用户

的mappedBy = “GROUPLIST” 是指

对于每个引用的用户,看它是否具有对我的引用(组对象)。如果是这样,建立我们的双向关系。所以如果你想通过USER_GROUP表链接用户和组,每个REFERENCED用户必须有一个组对象的引用。

现在让我们看看什么是testGetUserByEmail方法发生

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

在的createUser方法,你也有同样的情况如上图所示

所以我的建议是

当使用双向关系,始终使用添加便利方法

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

问候,

+0

我不认为你回答了他的问题:为什么发出删除命令?以及如何避免删除oposite表(不是联结表)? – 2012-02-15 13:08:40