У меня есть класс Traveller
с отношениями с TravellerVote
. Я хочу получить отправленные голоса путешественникам и полученные голоса.OneToMany отношение нет загрузка сбор
Путешественник Класс
@Entity
@PrimaryKeyJoinColumn(name="user_id")
public class Traveller extends User{
@OneToMany(mappedBy="voter", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
protected List<TravellerVote> myVotes;
@OneToMany(mappedBy="partner", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
protected List<TravellerVote> receivedVotes;
public Traveller(){
super();
myVotes = new ArrayList<TravellerVote>();
receivedVotes = new ArrayList<TravellerVote>();
}
public void addVote(TravellerVote vote){
myVotes.add(vote);
}
}
Класс TravellerVote
@Entity
public class TravellerVote {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(length=11)
protected long id;
@ManyToOne
@JoinColumn(name="voter_id")
protected Traveller voter;
@ManyToOne
@JoinColumn(name="partner_id")
protected Traveller partner;
@Column(nullable=false)
protected Date date;
@Column(length=300, nullable=true)
protected String comment;
@Column(nullable=false)
protected boolean positive;
public TravellerVote(Traveller voter, Traveller partner, String comment, boolean positive){
this.date = new Date();
this.voter = voter;
this.partner = partner;
this.comment = comment;
this.positive = positive;
}
}
Субъектами правильно сохраняется в базе данных, с этим:
TravellerDao dao = new TravellerDao();
Traveller t1 = dao.findByUsername("ramiromd");
Traveller t2 = dao.findByUsername("danimd");
Traveller t3 = dao.findByUsername("famartinezd");
t1.addVote(new TravellerVote(t1, t2, "Test comment", true));
t2.addVote(new TravellerVote(t2, t1, "Test comment", true));
t3.addVote(new TravellerVote(t3, t1, "Test comment", false));
dao.save(t1);
dao.save(t2);
dao.save(t3);
Но, когда в другом контроллере попробуйте получить голоса, коллекции имеют 0 элементов.
TravellerDao dao = new TravellerDao();
Traveller t1 = dao.findByUsername("ramiromd");
t1.getReceivedVotes().size(); // Must be 2 not 0.
t1.getMyVotes().size(); // Must be 1 not 0.
TravellerDao метод сохранения:
public void save(Traveller traveller) {
EntityManager em = PersistenceHelper.getEm();
em.getTransaction().begin();
em.persist(traveller);
//em.flush();
em.getTransaction().commit();
}
Это метод findByUsername:
public Traveller findByUsername(String username){
EntityManager em = PersistenceHelper.getEm();
String qstring = "SELECT t FROM Traveller t WHERE t.username LIKE :username";
TypedQuery<Traveller> query = em.createQuery(qstring, Traveller.class);
query.setParameter("username", username);
return query.getSingleResult();
}
Любые идеи?
flush() бессмысленно, это происходит в фиксации. Вы ничего не добавили к полученнымVotes в любой момент (установите его по обе стороны от отношения). –
Хорошо, я удаляю строку flush(), теперь только транзакция. Но коллекции не заполняются, когда я привожу путешественника. – ramiromd
errm, где код «получить путешественника»? Правильно ли он сохраняется в хранилище данных? нет смысла извлекать его, если он не сохраняется, как вы предполагали. Если это уже правильно, то удалите материал о том, что вы продолжаете с вопроса и показываете бит, который имеет значение. И журнал говорит, что, когда вы «забираете» его? –