2014-02-18 75 views
1

我想刪除用戶是所有者的所有組,但目前不起作用。我認爲在User.hbm.xml或Group.hbm.xml映射的層次上缺少某些東西,但我不知道。錯誤是「不能刪除或更新父行,外鍵約束失敗(sharedmapgroupe,約束FK_gq7win10rtxufsxu1n5istm2p外鍵(user_id)參考文獻userid))」無法刪除或更新父行:外鍵約束失敗(休眠xml映射)

這裏是類和文件中的XML關注:

User.java

public class User { 

    /** Attributs */ 


    @XmlTransient 
    private Set<Group> proprietaire; 

    /** Constructeur */ 
    public User() { 
    } 

    public User(String telephone, String pseudo, String email) { 
     super(); 
     this.pseudo = pseudo; 
     this.telephone = telephone; 
     this.email = email; 
    } 


    public Set<Group> getProprietaire() { 
     return proprietaire; 
    } 

    public void setProprietaire(Set<Group> proprietaire) { 
     this.proprietaire = proprietaire; 
    } 

    ... 

} 

userDAO的

public class UserDao { 

    private static SessionFactory sessionFactory = SessionConfiguration.getFactory(); 

    /** 
    * Method to ADD a user in the database 
    * 
    * @param user 
    * @return user_id 
    */ 
    public static Integer addUser(User user) { 
     Integer userID = null; 
     Session session = sessionFactory.openSession(); 
     Transaction tx = null; 

     try { 
      tx = session.beginTransaction(); 
      userID = (Integer) session.save(user);   
      tx.commit(); 
     } catch (HibernateException e) { 
      if (tx != null) 
       tx.rollback(); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 
     return userID; 
    } 

    /** 
    * 
    * Method to DELETE a user from the records 
    * 
    * @param telephone 
    */ 
    public static void deleteUser(String telephone) { 
     Session session = sessionFactory.openSession(); 
     Transaction tx = null; 
     String query = "select u from User u where u.telephone = :telephone"; 
     User user = (User) session.createQuery(query) 
       .setString("telephone", telephone).uniqueResult(); 
     try { 
      tx = session.beginTransaction(); 
      session.delete(user); 
      tx.commit(); 
     } catch (HibernateException e) { 
      if (tx != null) 
       tx.rollback(); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 
    } 
} 

User.hbm.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
    <class name="modele.User" table="user"> 
     <meta attribute="class-description"> 
     This class contains the user detail. 
     </meta> 
     <id name="id" type="int" column="id"> 
     <generator class="native"/> 
     </id> 
     <property name="pseudo" column="pseudo" type="string"/> 
     <property name="telephone" column="telephone" type="string" not-null="true" unique="true"/> 
     <property name="email" column="email" type="string"/> 

     <!-- Mapping Set<Demande> demandes --> 
     <set name="demandes" cascade="save-update,delete" lazy="false"> 
     <key column="demandeur_id"/>   
     <one-to-many class="modele.Demande"/> 
     </set> 

     <!-- Mapping Set<Invitation> aInvite --> 
     <set name="aInvite" cascade="save-update,delete" lazy="false"> 
     <key column="inviteur_id"/> 
     <one-to-many class="modele.Invitation"/> 
     </set> 

     <set name="notifications" cascade="save-update,delete" lazy="false"> 
     <key column="user_id"/> 
     <one-to-many class="modele.Notification"/> 
     </set> 


     <set name="groups" table="participation" lazy="false" inverse="true"> 
     <key column="user_id"/> 
     <many-to-many column="group_id" class="modele.Group"/> 
     </set> 

    <!-- Mapping Set<Group> proprietaire --> 
     <set name="proprietaire" cascade="save-update,delete" lazy="false"> 
     <key column="user_id"/> 
     <one-to-many class="modele.Group"/> 
     </set>  

    </class> 
</hibernate-mapping> 

Group.hbm.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
    <class name="modele.Group" table="groupe"> 
     <meta attribute="class-description"> 
     This class contains the publicEvent detail. 
     </meta> 
     <id name="id" type="int" column="id"> 
     <generator class="native"/> 
     </id> 
     <property name="description" column="description" type="string"/> 
     <property name="hashtag" column="hashtag" type="string"/> 
     <property name="password" column="password" type="string"/> 
     <!-- Mapping ArrayList<Marqueur> marqueurs --> 

     <set name="marqueurs" cascade="save-update,delete" lazy="false"> 
     <key column="group_id"/> 
     <one-to-many class="modele.Marqueur"/> 
     </set> 
     <!-- Mapping Set<Invitation> invitations --> 
     <set name="invitations" cascade="save-update,delete" lazy="false"> 
     <key column="group_id"/> 
     <one-to-many class="modele.Invitation"/> 
     </set> 

     <!-- Mapping Set<Demande> demandes --> 
     <set name="demandes" cascade="save-update,delete" lazy="false"> 
     <key column="group_id"/> 
     <one-to-many class="modele.Demande"/> 
     </set> 

     <!-- Mapping User proprietaire --> 
     <many-to-one name="proprietaire" class="modele.User" column="user_id" not-null="true"/> 

     <!-- Mapping ArrayList<User> invites --> 
     <set name="invites" table="participation" lazy="false"> 
     <key column="group_id"/> 
     <many-to-many column="user_id" class="modele.User"/> 
     </set> 

    </class> 
</hibernate-mapping> 

UserDaoTest.java

public class UserDaoTest { 

    private final String tel = "0601020304"; 
    private final String pseudo = "pseudo"; 
    private final String pseudoModified = "pseudo2"; 
    private final String email = "[email protected]"; 

    @Test 
    public void addUserTest(){ 

     User initialUser = new User(tel, pseudo, email); 

     // Add user in database 
     UserDao.addUser(initialUser); 

     User addedUser = UserDao.getUser(tel); 

     // Add Group in User 
     Group group = new Group(); 
     group.setDescription("description"); 
     group.setHashtag("hashtag"); 
     group.setPassword("password"); 
     //Set group proprietaire 
     group.setProprietaire(addedUser);    

     //Add group in database 
     GroupDao.addGroup(group); 

     // Add Group in User 
     Set<Group> groups = new HashSet<Group>(); 
     groups.add(group); 
     addedUser.setGroups(groups); 

     Assert.assertEquals(addedUser.getTelephone(), initialUser.getTelephone()); 
     Assert.assertEquals(addedUser.getPseudo(), initialUser.getPseudo()); 
     Assert.assertEquals(addedUser.getEmail(), initialUser.getEmail()); 
    } 


    @Test 
    public void deleteUserTest(){ 
     User user = UserDao.getUser(tel); 

     UserDao.deleteUser(user.getTelephone()); 

     List<User> listUsers = UserDao.listUser(); 

     Assert.assertFalse(listUsers.contains(user)); 
    } 
} 
+0

它需要很多代碼才能理解,請你把它降到需要的地步。 – Zeus

+0

我刪除了我的代碼的一些部分,並將錯誤跟蹤放在我的問題中 –

回答

2

請嘗試加入逆=真正到用戶文件集名稱的專有還與級聯= ALL」,刪除孤兒

當用戶被刪除其刪除該組。同時請非常小心你如何刪除用戶在休眠:

會話必須在刪除用戶之前刷新。
鏈接到您的用戶的所有組必須從所有活動會話和二級緩存中逐出。

+1

這個答案几乎是無法理解的。 「對用戶文件集名稱專有也」是什麼意思? – user1944491

相關問題