2011-12-17 4 views
0

У меня есть две сущности, конкуренция и команды:JPA ManyToOne и OneToMany отношения не сохраняющиеся

Конкурс:

@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 в конце кода, который я использую, чтобы попытаться отлаживать это.

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

+0

Какой IDE вы используете, NetBeans? – Lion

+0

Какие ошибки вы получили? – Lion

+2

@ Lion: как важна IDE? Java-код - это Java-код. Был ли он создан с помощью NetBeans или нет, не имеет значения. –

ответ

4

Преступник, вероятно, эта линия:

em.merge(user); 

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

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

user = em.merge(user); 
Смежные вопросы