2014-11-29 8 views
0

У меня есть класс 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); 

TravellerVote after save entities

Но, когда в другом контроллере попробуйте получить голоса, коллекции имеют 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(); 
} 

Любые идеи?

+0

flush() бессмысленно, это происходит в фиксации. Вы ничего не добавили к полученнымVotes в любой момент (установите его по обе стороны от отношения). –

+0

Хорошо, я удаляю строку flush(), теперь только транзакция. Но коллекции не заполняются, когда я привожу путешественника. – ramiromd

+0

errm, где код «получить путешественника»? Правильно ли он сохраняется в хранилище данных? нет смысла извлекать его, если он не сохраняется, как вы предполагали. Если это уже правильно, то удалите материал о том, что вы продолжаете с вопроса и показываете бит, который имеет значение. И журнал говорит, что, когда вы «забираете» его? –

ответ

0

Я не знаю, как сохранить ваш дао() метод выглядит, но есть:

getEntityManager().flush(); 

?

Если нет, пожалуйста, добавьте после сохранения и проверьте, помогло ли это.

+0

Да, я использую flush(). – ramiromd

+0

какой контейнер вы используете? Каков ваш постоянный провайдер? – iku

+0

, и только в целях тестирования вы можете добавить fetch = FetchType.EAGER в @OneToMany аннотацию в своих сущностях и проверить, не изменит ли она beheviour? – iku

1

В этих сценариях полезно включить отладку для реализации. Например, если вы используете Hibernate, установите уровень отладки пакета org.hibernate на «DEBUG». Это покажет вам все запущенные SQL. В ваших проблемах, если вы установите выборки равно LAZY, вы увидите точную SQLs увольняют эти заявления: -

t1.getReceivedVotes().size(); // Must be 2 not 0. 
t1.getMyVotes().size(); 

Будет надеяться, что даст вам достаточно намека, чтобы решить эту проблему.

Смежные вопросы