OneToMany和ManyToOne注释有什么意义,如果我必须手动填充List <object>?</object>

时间:2015-02-21 18:37:18

标签: jpa

我非常渴望让我的项目工作,基本上我所拥有的是数据库中的公司和产品表。我想在这两者之间建立单向关系,但是我无法在Company对象中填充产品列表。我在StackOverflow上找到的是这个答案

  

实体是Java对象。 Java的基本规则并没有改变   因为类上有@Entity注释。

     

所以,如果你实例化一个对象而它的构造函数不是   初始化其中一个字段,该字段初始化为null。

     

是的,确保构造函数是您的责任   初始化集合,或者所有方法都处理   该领域的可空性。

原文可以在这里找到。  JPA OneToMany - Collection is null

所以我想问,如果我必须在构造函数中填充列表,那么有什么意义呢?

编辑:

有些代码只是举例...... 公司对象

     @OneToMany(cascade = CascadeType.ALL, mappedBy = "company", fetch = FetchType.EAGER)
     private transient List<Product> productList;

产品对象

    @ManyToOne(optional = false,fetch = FetchType.EAGER)
    @JoinColumn(name = "company", referencedColumnName = "id")
    private Company company; //however, in database I have field of type int as a foreign key, I dont need company object here...

编辑2: 我知道通过使用 new Company();它不会填写ProductList,但我获得公司的方式是

em.createNamedQuery("Company.findById", Company.class).setParameter("id", id).getResultList();

最终编辑: 删除transient关键字就可以了。

对不起,我没有想到这一点&#34;瞬态&#34;可能会导致问题。这是我的错误,因为懒惰。我使用瞬态是因为它在使用GSON进行序列化时会造成一些麻烦,并且有两种方法可以使它工作,一种是使用Expose注释而另一种是瞬态的,这看起来是个好主意。我试图让它工作太辛苦,并没有意识到真正的问题在哪里,所以再次抱歉,这个问题毫无意义。我甚至认为使用OneToMany注释它不会填满我的列表

1 个答案:

答案 0 :(得分:1)

关键是JPA将在从数据库加载对象时实例化并填充它们。但是,当你从空气中创建实例时。

new Company()创建了一个新的公司实例,JPA对此一无所知。所以是的,很明显,在这种情况下,公司的产品是null,因为构造函数没有将它设置为其他任何东西。

另一方面,em.find(Company.class, 23L)将从具有ID 23的数据库返回公司,并且该公司将具有包含公司产品的非空产品列表。