简体   繁体   English

OneToMany关系不加载集合

[英]OneToMany relation not load collection

I have a class Traveller with a relationship with TravellerVote . 我有一班TravellerTravellerVote有联系。 I wish retrieve the sending votes the travellers and the votes received. 我希望检索旅行者的发送票和收到的票。

Class Traveller 班级旅行者

@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);
    }
}

Class 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;   
    }
}

The entities are persisted correctly in the database, with this: 可以使用以下方法将实体正确保留在数据库中:

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);

Traveller在保存实体后投票

But, when in other controller try get the votes, the collections have 0 elements. 但是,当在其他控制器中尝试获得投票时,集合具有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.

The TravellerDao save method: TravellerDao保存方法:

public void save(Traveller traveller) {
    EntityManager em = PersistenceHelper.getEm();
    em.getTransaction().begin();
    em.persist(traveller);
    //em.flush();
    em.getTransaction().commit();
}

It is the findByUsername method: 这是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();
}

Any ideas ? 有任何想法吗 ?

In these scenarios , it is helpful to enable debugging for implementation framework. 在这些情况下,为实现框架启用调试是有帮助的。 For example , if you are using Hibernate , set the debug level of org.hibernate package to "DEBUG". 例如,如果您使用的是Hibernate,请将org.hibernate包的调试级别设置为“ DEBUG”。 That will show you all SQLs being fired. 这将向您显示所有被触发的SQL。 In your problem , if you set fetch equal to LAZY , you will see exact SQLs being fired for these statements :- 在您的问题中,如果将fetch设置为LAZY,则将看到针对这些语句触发的确切SQL:

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

Hopefully ,that will give you enough hint to solve this issue. 希望这会给您足够的提示来解决此问题。

I don't know how your dao save() method looks like but is there: 我不知道您的dao save()方法是什么样的,但是在那里:

getEntityManager().flush();

?

If no please add after persist and check whether it helped. 如果否,请在坚持后添加并检查是否有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM