私はSpringには新しく、多対多の関係を期待しています。関係は正常に動作し、テーブルが作成され、データが正しく挿入されます。私が期待しているのは、リストを空にする(つまり、 "Group"タイプのオブジェクトからArrayListの "users"を空にする)、システムはデータベースから関係を削除することを期待します。Spring + JPA多対多の関係
私は次のクラスがあります。
ここ@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>();
...
}
はDAOを以下のとおりです。
@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!
}
私が何か間違ったことか、それは午前:ここ
@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;
}
}
は、試験方法でありますすることができない何か?
いずれのヒントも本当に感謝しています。
ありがとうございました!
カスケード '属性'に 'delete-orphan'を追加しようとしましたか? – fasseg
'IdTransferringMergeEventListener'を宣言しましたか? – axtavt
これが問題の原因であるかどうかはわかりませんが、saveメソッドはvoidを返すべきではありません。マージコールの結果を返す必要があります。この変更を行い、返されたグループを使ってみましょう: 'g = groupDao.save(g);' –