2014-05-15 1 views
0

Я пытался выяснить, как это сделать когда-нибудь без везения и не нашел ничего полезного во время поиска в Google.Получите отчет из другой таблицы, используя JPA

У меня есть три таблицы:

HOTEL 
- id 
- name 
- local_id (foreign key) 

DESCRIPTION 
- id 
- description 
- hotel_id (foreign key) 
- locale_id (foreign key) 

LOCALE 
- id 
- local 

У меня есть следующий ГОСТИНИЦА DAO модель:

@Entity 
@Table(name = "HOTEL") 
public class Hotel implements Serializable { 

    @Column(name = "id") 
private long id; 

    @Column(name = "description") 
    private HotelDescription description; 
} 

Использование JPA, как я могу восстановить данные из таблицы ОПИСАНИЕ на основе hotel_id и locale_id для заполнения описание в DAO model Отель?

ответ

1

Ну, у вас также есть объект описания объекта JPA, правильно? Таким образом, вы можете определить двунаправленное сопоставление для объектов.

вместо

@Column(name = "description") 
private HotelDescription description; 

вы должны иметь что-то вроде

@OneToOne(mappedBy = "hotel", cascade = CascadeType.ALL) 
private HotelDescription desc; 

, а с другой стороны, в HotelDescription вы должны иметь обратно отображение

@OneToOne 
@JoinColumn(name = "hotel_id") 
private Hotel hotel; 

Когда вы извлечете отель субъект, JPA также получит дочернее лицо (HotelDescription) для вас.

, если вы хотите использовать @OneToMany отображение это будет (много описаний для одного отеля)

@OneToMany(mappedBy = "hotel", cascade = CascadeType.ALL) 
private HotelDescription desc; 

и на другой стороне

@ManyToOne 
@JoinColumn(name = "hotel_id") 
private Hotel hotel; 

В JPA вы можете использовать несколько типов отображения как OneToMany, ManyToMany ... Это только основы. Найдите учебник. Вы можете начать здесь: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html (не самый лучший), возможно,

Oh. И убедитесь, что вы аннотируете идентификатор с помощью @Id

+0

Пожалуйста, смотрите мой комментарий ниже! –

0

Я бы подумал о том, чтобы вырезать таблицу Locale и работать с java.util.Locale напрямую. Hibernate (не уверен в других реализациях JPA) имеет преобразование автоматического типа из столбца char в java.util.Locale. Это будет выглядеть примерно так:

DESCRIPTION 
- id 
- description 
- hotel_id (foreign key) 
- locale 

И Entity:

import java.util.Locale; 

@Entity 
    @Table(name = "HOTEL") 
    public class Hotel implements Serializable { 

     @Column(name = "id") 
     private long id; 

     @OneToMany 
     @JoinColumn(name = "holiday_id", nullable = false) 
     @MapKeyColumn(name = "locale_id") 
     private Map<Locale, HotelDescription> descriptions; 

     public String getDescriptionForLocale(Locale locale){ 

      //try an exact match e.g. en_us 
      if(descriptions.containsKey(locale){ 
       return descriptions.get(locale).getDescription(); 
      } 
      //try language only e.g. en 
      else if (decsriptions.containsKey(locale.getLanguage){ 
       return descriptions.get(locale.getlanguage()).getDescription(); 
      } 

      //return a default or null 
      return ?? 
     } 
    }