Весна + JPA отношения многие ко многим - PullRequest
6 голосов
/ 12 января 2012

Я очень новичок в Spring и пытаюсь заставить отношения многих со многими работать, как я ожидаю. Отношения работают нормально, таблицы создаются и данные вставляются правильно. Что я ожидаю, так это то, что когда я очищаю List (т.е. я очищаю ArrayList «users» от объекта типа «Group»), я ожидаю, что система удалит отношения из базы данных - но это не так. *

У меня есть следующие классы:

@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:

@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
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!
}

Я что-то не так делаю или это невозможно?

Любая подсказка действительно ценится.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Я перечитал ваш вопрос, и теперь ответ ясен. Создайте группу g и сохраните ее. Но так как ваш метод сохранения использует merge, и вы не учитываете значение, возвращаемое merge, чтобы присвоить его g, вы продолжаете объединять переходную группу g, которой никогда не назначается какой-либо идентификатор. Таким образом, каждый раз, когда вызывается слияние, вы фактически создаете новую группу, а не изменяете ранее созданную.

Измените метод сохранения на

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

и всегда переназначать результат на g:

g = groupDao.save(g);

Конечно, то же самое должно быть сделано для пользователя.

0 голосов
/ 12 января 2012

вы только удаляете пользователей из группы, этого недостаточно. вам нужно удалить всех пользователей из группы и удалить эту группу из списка всех этих пользователей в группах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...