使用Set的多对一映射

时间:2016-08-10 05:37:24

标签: hibernate

我有两个表,供应商和公司。

公司已经成立。在创建供应商的同时,我将获得供应商供应商品的公司列表。

列表将包含companies_id,这是公司的主键。 在供应商表中插入供应商详细信息时,我希望将供应商映射到公司表格中的公司。

我正在我的SupplierEO中进行此映射

@ManyToOne(cascade = CascadeType.ALL,fetch=FetchType.EAGER, targetEntity = CompanyEO.class)
    @JoinColumn(name="Company_ID")
    public Set<CompanyEO> getCompanyEO() {
        return companyEO;
    }

public void setCompanyEO(Set<CompanyEO> companyEO) {
    this.companyEO = companyEO;
}

保存供应商详细信息时出现以下错误

  

org.hibernate.PropertyAccessException:IllegalArgumentException   发生了调用CompanyEO.carrierId的getter

1 个答案:

答案 0 :(得分:0)

为什么不使用@ManyToMany@OneToMany?因为如果CompanyEO中有多个SupplierEO,则需要拥有toMany关系。 此外,如果您有多个CompanyEO,请同样称呼它们。将一组公司称为公司是误导性的,特别是对于不了解您的代码的人。

关于您的例外情况:请查看此post。 基本上JB Nizet所说的是:

  

我的猜测是Hibernate使用自己的Set(PersistentSet)实现来调用你的setter,它实现了延迟加载,并且在调用setter时尚未初始化。由于你在这个集合上调用一个方法,它会使set自身处于加载阶段,这会使Hibernate处于一个不一致的状态。

因此,最好使用字段访问而不是属性访问。

编辑:哦,还请添加整个堆栈跟踪,而不是代码而不是块引用。