我非常渴望让我的项目工作,基本上我所拥有的是数据库中的公司和产品表。我想在这两者之间建立单向关系,但是我无法在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注释它不会填满我的列表
答案 0 :(得分:1)
关键是JPA将在从数据库加载对象时实例化并填充它们。但是,当你从空气中创建实例时。
new Company()
创建了一个新的公司实例,JPA对此一无所知。所以是的,很明显,在这种情况下,公司的产品是null,因为构造函数没有将它设置为其他任何东西。
另一方面,em.find(Company.class, 23L)
将从具有ID 23的数据库返回公司,并且该公司将具有包含公司产品的非空产品列表。