【问题标题】:Hibernate One-to-One Mapping not fetching child class data with parent classHibernate 一对一映射不使用父类获取子类数据
【发布时间】:2016-11-25 13:12:02
【问题描述】:

我有两个表,第一个表包含 company_id、company_name 和国家名称,第二个表包含一对一映射的公司相关详细信息。

这是我的表结构:-

    company {
      company_id int,
      company_name varchar,
      country varchar
    }

    company_detail {
      id int,
      company_id int,
      company_description text,
      future_goal text
    }

POJO 中使用的以下映射:-

在公司 POJO 中:-

@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="COMPANY_ID")  
private CompanyDetails companyDetails;

在 CompanyDetail POJO 中:-

@OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="COMPANY_ID")  
public Company company;

但是当我得到 company 对象时,它在 companyDetails 中包含 null。

以下用于获取公司对象的代码:-

  Company company = (Company) session.get(Company.class, companyId);

我想将 companyDetails 数据与公司数据一起获取。

我做错了吗? 解决此问题需要更改哪些代码。

【问题讨论】:

  • 您的字段是 CompanyCaptiveDetails 的私有类,但您的 POJO 名为 CompanyDetail。请解释一下
  • 抱歉,我已经更正了我的问题。现在请看
  • 阅读有关双向关联的休眠文档。一侧(没有外键的一侧)必须是另一侧的倒数,使用​​ mappedBy。在您的映射中,您定义了两个单独的一对一关联。而且您说 company.company_id 是 company_detail.id 的连接列(即外键),这是不正确的。我真的不明白这两个表的意义。您可以将所有内容都放在 company 表中。

标签: java hibernate spring-mvc hibernate-annotations


【解决方案1】:

使用双向@OneToOne 关系(阅读more info 了解它):

// in Company POJO:
@OneToOne(mappedBy="company", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private CompanyDetails companyDetails

// in CompanyDetails POJO:
@OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="company_id")  
public Company company;

然后在获取company 对象后,您可以获取它的详细信息(因为CompanyCompanyDetails 归档):

Company company = (Company) session.get(Company.class, companyId);
CompanyDetails details = company.getCompanyDetails();

【讨论】:

  • 非常感谢。
【解决方案2】:

在两个 POJO 中你都有:

@JoinColumn(name="COMPANY_ID")

你应该把它改成

@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "company")
private CompanyDetails companyDetails;

@OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="COMPANY_ID")  
public Company company;

【讨论】:

  • 非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 2017-04-08
  • 2011-07-04
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多