【问题标题】:What is point of OneToMany and ManyToOne anotations, if I have to fill List<Object> manually?如果我必须手动填写 List<Object>,OneToMany 和 ManyToOne 注释有什么意义?
【发布时间】:2015-02-21 18:37:17
【问题描述】:

我迫切希望使我的项目能够正常工作,基本上我所拥有的是数据库中的公司和产品表。我想在这两者之间建立单向关系,但是我无法在 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;

还有 Product 对象

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

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

很抱歉,我没有想到“瞬态”会导致问题。那是我因为懒惰而犯的错误。我使用瞬态是因为它在使用 GSON 序列化时造成了一些麻烦,并且有两个选项可以使它工作,一个是使用 Expose 注释,另一个是瞬态的,这看起来是个好主意。我试图让它工作得太辛苦,但没有意识到真正的问题在哪里,所以再次抱歉,这个问题毫无意义。我认为即使使用 OneToMany 注释它也不会填满我的列表

【问题讨论】:

    标签: jpa


    【解决方案1】:

    关键是 JPA 会在从数据库加载对象时为您实例化并填充它们。但当您凭空创建实例时则不然。

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

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

    【讨论】:

    • 是的,我知道,但有趣的是,我得到公司的方式不是“new Company()”,而是 List lc = em.createNamedQuery("Company.findById", Company. class).setParameter("id", id).getResultList(); if(!lc.isEmpty()) 返回 lc.get(0);它给了我公司,但没有填写 ProductList
    • 从列表声明中删除 transient。另外,如果这是您面临的问题,您为什么要提出完全不同的问题?
    • 很抱歉,我没有想到“瞬态”会导致问题。那是我因为懒惰而犯的错误。我使用瞬态是因为它在使用 GSON 序列化时会造成一些麻烦,并且有两种选择可以使它工作,一种是使用 Expose 注释,另一种是瞬态的,这看起来是个好主意。我试图让它工作太努力所以再次抱歉,这个问题毫无意义。我认为即使使用 OneToMany 注释它也不会填满我的列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2011-01-07
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多