Отношения JPA ManytoOne и OneToMany не сохраняются - PullRequest
0 голосов
/ 18 декабря 2011

У меня есть две сущности: соревнование и команда:

Конкурс:

@Entity
public class Team implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
int id;

@Column(length=255)
String name;

@ManyToOne(optional=true)
Competition nextCompetitionAttending;
List<SiteUser> teamMembers;

nextComeptitionAttending устанавливается следующим способом:

public void setNextCompetitionAttending(Competition nextCompetitionAttending) {
    this.nextCompetitionAttending = nextCompetitionAttending;
    nextCompetitionAttending.addTeam(this);
}

Конкуренция определяется так:

@Entity
public class Competition implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
int maxTeamSize;
String name;

@OneToMany(mappedBy="nextCompetitionAttending" )
List<Team> teamsAttending;

Мой код персистентности выглядит так:

             utx.begin();
        EntityManager em = emf.createEntityManager();
        em.merge(user);
        Competition c = em.find(Competition.class, id);
        Team teamon = user.getTeamOn();
        teamon.setNextCompetitionAttending(c);
        System.out.println("Set next");
        em.flush();
        utx.commit();
        em = emf.createEntityManager();
        Team t = em.find(Team.class, teamon.getId());
        System.out.println(t.getNextCompetitionAttending());

В базе данных столбец «NEXTCOMPETITIONATTENDING_ID» равен нулю, как и println в конце кода, который я использовал для отладки этого.

Почему это не сохраняется?

1 Ответ

4 голосов
/ 18 декабря 2011

Виновным, вероятно, является эта строка:

em.merge(user);

пользователь - это отдельная сущность, и вы объединяете ее. Затем вы получаете команду от пользователя. Но слияние не делает отдельную сущность прикрепленной. Он загружает присоединенного пользователя, копирует состояние из отключенного в присоединенное и возвращает присоединенного. Итак, все последующие изменения, которые вы делаете, выполняются для отсоединенного объекта.

Заменить эту строку на

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