0

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

Моего дизайн DB (упрощенно): db design Поэтому у меня есть таблица с не переводимыми данные и дополнительной таблицей с переведенным содержанием, но с дополнительным полем «локалите» для различения языка.

Мои классы Java выглядит следующим образом:

public class Car { 

private Long id; 
private Long length; 
private Long weight; 
private CarTranslated carTranslated; 

// getters and setters 

public class CarTranslated { 

private Long id; 
private Long carId; 
private String desc; 

// getters and setters 

Я хочу, чтобы иметь возможность получить один автомобиль с одним запросом. При регулярном JDBC я хотел бы использовать что-то вроде этого SQL запроса:

public Car getById(Long id, Locale locale) { 
Car c = new Car(); 
String sql = "select c.car_id, c.length, c.weight, ct.id, ct.descryption, 
ct.car_id as "Translated car_id" from car c join car_translated ct on 
(c.car_id = ct.car_id) where c.car_id ="+ id+" and ct.locale ='"+locale+"'"; 

// code to set fields of the object using ResultSet 

return c; 
} 

Что бы отображения зимует аннотации и запрос для этой установки? Я попробовал несколько попыток, но безрезультатно. В настоящее время моя лучшая попытка была, как показано ниже:

Mapping:

@Entity 
@Table(name="CAR") 
public class Car { 

@Id 
@Column(name="car_id") 
private Long carId; 

@Column (name="weight") 
private Long carWeight; 

@Column (name="length") 
private Long carLength; 

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name ="CAR_ID") 
private CarTranslated localized; 

// getters and setters 

@Entity 
@Table(name="CAR_TRANSLATED") 
public class CarTranslated { 

@Id 
@Column (name="id") 
private Long id; 

@Column (name="car_id") 
private Long carId; 

@Column (name="descryption") 
private String desc; 

@Column(name="locale") 
private Locale locale; 

DAO:

public Car getCarById(Locale locale, Long id) { 
    Car car = new Car(); 
    try { 
     Session session = HibernateUtils.getSessionFactory().openSession(); 
     Criteria cr = session.createCriteria(Car.class) 
      .add(Restrictions.eq("carId", id)); 
     Criteria cr1 = session.createCriteria(CarTranslated.class) 
      .add(Restrictions.eq("locale", locale)); 

     car = (Car) cr.uniqueResult(); 
     car.setLocalized((CarTranslated) cr1.uniqueResult()); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
    return car; 
} 

Это работы вокруг, и мне интересно, что будет надлежащим способ сделать это?

ответ

0

При сопоставлении с FK вы должны иметь аннотацию в обоих столбцах. (JavaDoc)