2012-01-12 7 views
6

Spring için çok yeni ve beklediğimden çok çok ilişki kurmaya çalışıyorum. İlişkiler iyi çalışır, tablolar oluşturulur ve veriler doğru şekilde eklenir. Beklediğim şey, bir Listeyi boşaltırken (yani "Grup" türündeki bir nesneden "ArrayList" kullanıcılarını boşaltırsam), sistemin veritabanındaki ilişkileri kaldırmasını beklerim - fakat bunu yapmaz. Spring + JPA birçok ilişkiye çok fazla

Aşağıdaki sınıflar var:
@Test 
public void test() 
{ 
    Group g = new Group(); 
    g.setName("Test group"); 
    groupDao.save(g); // Works fine - inserts the group into the database 

    User u = new User(); 
    u.setName("Test user"); 
    userDao.save(u); // Works fine - inserts the user into the database 

    g.addUser(u); 
    groupDao.save(g); // Works fine - adds the many-to-many relationship into the database 

    g.removeAllUsers(); 
    groupDao.save(g); // Doesn't work - I'm expecting it to remove all the related relationships from the database but it doesn't! 
} 

yanlış bir şey yaptığını Am I veya öyle: Burada
@Repository 
public class GroupJpaDao implements GroupDao 
{ 
    private EntityManager em; 

    @Transactional 
    public void save(Group group) 
    { 
     this.em.merge(group); 
    } 

    ... 

    @PersistenceContext 
    void setEntityManager(EntityManager entityManager) 
    { 
     this.em = entityManager; 
    } 
} 

@Repository 
public class UserJpaDao implements UserDao 
{ 
    private EntityManager em; 

    @Transactional 
    public void save(User user) 
    { 
     this.em.merge(user); 
    } 

    ... 

    @PersistenceContext 
    void setEntityManager(EntityManager entityManager) 
    { 
     this.em = entityManager; 
    } 
} 

test yöntemidir: DAOs İşte

@Entity 
@Table(name = "`group`") 
public class Group 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @Column(name = "name") 
    private String name; 

    @ManyToMany(cascade = {CascadeType.ALL}) 
    @JoinTable(
      name = "`user_has_group`", 
      joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"), 
      inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id") 
    ) 
    private List<User> users = new ArrayList<User>(); 

    ... 
} 

@Entity 
@Table(name = "`user`") 
public class User 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @Column(name = "name") 
    private String name; 

    @ManyToMany(mappedBy = "users") 
    private List<Group> groups = new ArrayList<Group>(); 

    ... 
} 

vardır bir şey yapmak mümkün değil mi?

Herhangi bir ipucu gerçekten takdir edilmektedir.

Teşekkür ederiz!

+0

"Silme-yitimi" kaskat 'özniteliğinize eklemeye çalıştınız mı? – fasseg

+0

"IdTransferringMergeEventListener" ifadesini kullandınız mı? – axtavt

+0

Sorunun nedeninin bu olduğunu bilmiyorsunuz, ancak kaydetme yöntemi geçersiz sayılmamalıdır. Birleştirme çağrısının sonucunu döndürmelidir. Bu değişikliği yapmayı ve döndürülen grubu kullanmayı deneyin: 'g = groupDao.save (g);' –

cevap

2

Sorunu tekrar okudum ve şimdi yanıt açık. Grubunuz bir g oluşturun ve kaydedin. Ancak, kaydetme yönteminiz merge kullanıyor ve merge tarafından döndürülen değeri g'a atamayacağınız için, hiçbir kimliği atanmamış geçici grup g'yi birleştirmeye devam ediyorsunuz. Yani, her defasında birleştirme denir, aslında daha önce oluşturulmuş olanı değiştirmek yerine yeni bir grup yaratırsınız.

Değişim

public Group save(Group group) 
{ 
    return this.em.merge(group); 
} 

yöntemi kaydetmek ve her zaman g sonucu yeniden atama: Elbette

g = groupDao.save(g); 

, aynı kullanıcı için yapılmalıdır.

+0

Teşekkür ederim çok, bu sorunu çözdü! – satoshi

0

Yalnızca kullanıcıları gruptan siliyorsunuz, bu yeterli değil. grubundan tüm kullanıcıları kaldırmanız ve o grubun tüm kullanıcı gruplarından listesinden kaldırmanız gerekir.

+0

Sahip olma tarafı grup olduğu için gerekli olmamalıdır. –

+0

emin misin? Sonuçta pek çok şey var. satoshi, lütfen bunu deneyebilir misin? itiraf etmeliyim ilk önce test etmedim:/ – davogotland

+0

Evet, eminim. Belgeler şöyle der: "Derleme iki yönlü ise, bir tarafın sahibi olması ve bir tarafın ters ucu olması gerekir (yani ilişkilendirme tablosundaki ilişki değerleri güncellenirken göz ardı edilir):" –