Присоединение к таблице OneToOne в спящем режиме

Изучаем спящий режим. У меня есть следующие классы User, Region, Country следующим образом

     public class User {

     @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;
     @Column(name = "first_name")
     Private String firstName;
     @Column(name = "last_name")
     private String lastName;
     @OneToOne(fetch = FetchType.EAGER)
     @JoinTable(name = "user_country_region", joinColumns ={@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name =   "country_id") })
     private Country userCountry;

     @OneToOne(fetch = FetchType.EAGER)
     @JoinTable(name = "user_country_region", joinColumns = {@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "region_id") })
     private Region userRegion;

     //With its respective Getters and Setters 
   }

    public class Country {

     @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;
     @Column(name = "name")
     private String name;

     //With its respective Getters and Setters 
   }

   public class Region {

     @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
     private int id;
     @Column(name = "name")
     private String name;

     //With its respective Getters and Setters 
   }

Проблема, с которой я сталкиваюсь, заключается в том, что запрос гибернации возвращает только регион, а не страну. Что может быть причиной этого?

Попытался получить значения страны и региона, как показано ниже.

    System.out.println("Country: "+user.getCountry().getName());
    System.out.println("Region: "+user.getRegion().getName());

Ответ от Hibernate Show sql. Кажется, отсутствует информация о стране.

    Hibernate: 
    select
       this_.id as id1_3_3_,
       this_.first_name as first_na2_3_3_,
       this_.last_name as last_na3_3_3_,
       region2_.id as id1_8_2_,
       region2_.name as name2_8_2_ 
    from
       user this_ 
    left outer join
       user_country_region this_1_ 
       on this_.id=this_1_.user_id  
    left outer join
    region region2_ 
       on this_1_.region_id=region2_.id 
    where
    this_.id=?

person Kelvin Muia    schedule 11.04.2016    source источник
comment
Не могли бы вы подтвердить названия ваших столов. user_country_region, user_coutnry_region? Оба правильны? просто начать с основ?   -  person LearningPhase    schedule 11.04.2016
comment
Да они такие же. Поля в таблице следующие: user_id, country_id, region_id. Эта таблица присоединяется к трем.   -  person Kelvin Muia    schedule 11.04.2016
comment
только что обновил вопрос о том, как я пытался инициализировать страну и регион пользователя   -  person Kelvin Muia    schedule 11.04.2016
comment
Это не код инициализации. Спящий режим извлекает все данные с User причиной fetch = FetchType.EAGER. Пожалуйста, включите ведение журнала SQL и добавьте журналы к своему вопросу, чтобы увидеть, как Hibernate извлекает данные.   -  person v.ladynev    schedule 11.04.2016
comment
Я обновил вопрос и прикрепил ответ SQL в спящем режиме.   -  person Kelvin Muia    schedule 11.04.2016
comment
Означает ли это, что @JoinTable применяется только при наличии одного внешнего ключа? то есть таблица user_country имеет два идентификатора country_id и region_id.   -  person Kelvin Muia    schedule 11.04.2016


Ответы (1)


Это недопустимое сопоставление. У меня есть эта ошибка с Hibernate 5 при создании схемы с помощью Hibernate.

org.hibernate.boot.spi.InFlightMetadataCollector$DuplicateSecondaryTableException: 
Table with that name [user_country_region] already associated with entity

В любом случае, если вы можете использовать это сопоставление с вашей версией Hibernate, такое сопоставление с таблицей соединений для двух отношений подвержено ошибкам.

Просто используйте это сопоставление, чтобы связать User с Country и Region по столбцам внешнего ключа.

public class User {

     @OneToOne
     private Country country;

     @OneToOne
     private Region region;

   }
person v.ladynev    schedule 11.04.2016
comment
Кажется, других решений не существует, что странно. Придется с этим поработать. - person Kelvin Muia; 11.04.2016
comment
Работает, когда я переключаюсь с OneToOne на @ManyToMany. Как? У меня нет идей. - person Kelvin Muia; 11.04.2016