Gourav Saklecha
Gourav Saklecha

Reputation: 363

Hibernate One-to-One Mapping not fetching child class data with parent class

I have two tables, 1'st table contains company_id, company_name and country name and second table contain company related detail with one to one mapping.

This is my table structure :-

    company {
      company_id int,
      company_name varchar,
      country varchar
    }

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

Following mapping used in POJO :-

In Company POJO :-

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

In CompanyDetail POJO :-

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

But when I get company object its contain null in companyDetails.

Following code used to get Company Object :-

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

I want to get companyDetails data together with company data.

am I doing something wrong? What Code changes required to fix this problem.

Upvotes: 2

Views: 3274

Answers (2)

DimaSan
DimaSan

Reputation: 12724

Use the bidirectional @OneToOne relationships (read more info about it):

// 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;

Then after fetching the company object, you can get it's details (as Company has CompanyDetails filed):

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

Upvotes: 3

pleft
pleft

Reputation: 7905

In both POJOs you have:

@JoinColumn(name="COMPANY_ID")

You should change this to

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

and

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

Upvotes: 2

Related Questions