2016-11-25 1 views
2

У меня есть две таблицы, 1-я таблица содержит company_id, имя_компании и название страны, а вторая таблица содержит детали, связанные с компанией, с одним сопоставлением.Hibernate One-to-One Сопоставление не получения данных дочернего класса с родительским классом

Это моя структура таблицы: -

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; 

Но когда я получаю объект компании, он содержит null в companyDetails.

После код, используемый для получения объекта компании -

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

Я хочу, чтобы получить данные companyDetails вместе с данными компании.

Я делаю что-то неправильно? Какие изменения кода необходимы для устранения этой проблемы.

+0

Ваше поле является частным классом 'CompanyCaptiveDetails' но ваш POJO называется' CompanyDetail' , Объясните пожалуйста – henrik

+0

Извините, я исправил свой вопрос. Теперь посмотрим –

+0

Прочитайте документацию о спящем режиме для двунаправленных ассоциаций. одна сторона (та, которая не имеет внешнего ключа) должна быть обратная с другой стороны, используя mappedBy. В вашем сопоставлении вы определяете две отдельные связи между собой. И вы сообщаете, что company.company_id - это столбец объединения (например, внешний ключ) для company_detail.id, что неверно. Я не вижу смысла в этих двух таблицах. Вы могли бы просто положить все в таблицу компаний. –

ответ

3

Использование двунаправленные @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 объект, вы можете получить его детали (как Company имеет CompanyDetails подал):

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

Большое вам спасибо. –

2

В обоих POJOs у вас есть:

@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; 
+0

Большое вам спасибо. –

Смежные вопросы