2010-01-17 81 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