2009-08-19 13 views
5

2 varlığım var: User and UsersList.Hazırda bekleme @ManyToMany bağlantıyı sil

@Entity 
@Table(name = "USERS") 
public class User { 
    @Id 
    @GeneratedValue 
    @Column(name = "ID") 
    private Long id; 

    @ManyToMany(cascade = CascadeType.REMOVE, mappedBy = "users") 
    private List<UsersList> usersLists = new ArrayList<UsersList>(); 

    public List<UsersList> getUsersLists() { 
     return usersLists; 
    } 

    public void setUsersLists(List<UsersList> usersLists) { 
     this.usersLists = usersLists; 
    } 
} 

ve bu gibi

@Entity 
@Table(name = "USERS_LIST") 
public class UsersList { 
    @Id 
    @GeneratedValue 
    @Column(name = "ID") 
    private Long id; 

    @ManyToMany 
    private List<User> users = new ArrayList<User>(); 

public List<User> getUsers() { 
     return users; 
    } 

    public void setUsers(List<User> users) { 
     this.users = users; 
    } 
} 

ve kod: Aşama 1 'de

deleteWithHibernate(Long id) { 
     User usr = hibernateTemplate.get(User.class, id); 
     hibernateTemplate.delete(usr); 
} 

Kullanıcıların 3 satırları

// 1 
List<User> dbUsers; // 3 the user instances are persisted in DB 
UsersList usersList = new UsersList(); 
usersList.setUsers(dbUsers); 

// 2 - now persist the usersList using hibernate... 
saveWithHibernate(usersList); 

//3 - delete using a persisted user 
deleteWithHibernate(dbUsers.get(0).getId()); 

(USER_IDEND_LINK) Tablo .

2. adımdan sonra (ikinci yorum) USERS_LIST (USERS_LIST_ID) tablosunda 1 satır ve USERS_LIST_USERS (USER_ID, USERS_LIST_ID) 3 satırındaki birleştirme tablosuna sahibim.

3. adımda ulaşmak istediğim şudur: KULLANICI tablosundan bir kullanıcıyı sildiğimde - USER_ID = 4 olan bir kullanıcı diyelim, ben sadece birleşim tablosundan USER_ID = 4 olan satırın silinmesini istiyorum ve diğerleri kalacak.

Sorunuma bir açıklama çözümü var mı?

+0

deleteWithHibernate yöntemi nasıl görünür? –

cevap

-1

Ne ihtiyacınız @JoinTable niteliktir sen CascadeType.ALL bu annotaion olarak

@OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 

ve değişim cascade.remove kodunuzu bu

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "users") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    private List<UsersList> usersLists = new ArrayList<UsersList>(); 
+0

@OnDelete, belirli bir açıklama için hazırda bekletme yapmıştır ve JPA'da bulunmamaktadır. – Mohsen

9

gibi bir şey olmalı gerekir düşünüyorum : Hazırda bekletme, çoktan çoğa ilişkinin birbiriyle ilişkili olduğunu ve muhtemelen iki birleştirme tablosu oluşturacağını bilmez. İlişkinin her iki tarafında da aynı @JoinTable belirtirseniz, beklendiği gibi çalışır.

BirleştirColumn ve inverseJoinColumn öğesinin, ilişkinin karşıt tarafındaki taraflarında karşıt olduğundan emin olun. diğer tarafta

umarım bu yardımcı olur Bir tarafında == joinColumn diğer tarafta

  • inverseJoinColumn üzerinde bir tarafta == inverseJoinColumn üzerinde

    • joinColumn.

      @Entity 
      public class Role extends Identifiable { 
      
          @ManyToMany(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
          @JoinTable(name="Role_Permission", 
            [email protected](name="Role_id"), 
            [email protected](name="Permission_id") 
           ) 
          public List<Permission> getPermissions() { 
           return permissions; 
          } 
      
          public void setPermissions(List<Permission> permissions) { 
           this.permissions = permissions; 
          } 
      } 
      
      @Entity 
      public class Permission extends Identifiable { 
      
          @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
          @JoinTable(name="Role_Permission", 
            [email protected](name="Permission_id"), 
            [email protected](name="Role_id") 
           ) 
          public List<Role> getRoles() { 
           return roles; 
          } 
      
          public void setRoles(List<Role> roles) { 
           this.roles = roles; 
          } 
      
      } 
      
  • +1

    Çözümümde '@JoTable' kullanıyorum, ancak yine de Satırları silemiyorum. Bahsettiğiniz tüm kaskadlardan bahsetmek gerekli mi? – Logan

    +1

    OP, 'mappedBy' işlevini kullanır, '@ JoinTable'ın neye benzemesi gerektiğini öğrenmek için hazırda beklemeniz yeterli değil mi? Tam adlarınızın kullanılmasını gerçekten istemediğiniz sürece, '@ JoinTable' adını ve sütunlarını açıkça listelemek biraz gereksiz görünüyor. – fommil

    +0

    Harika çözüm! – kinkajou