Я хочу получить международный контент из базы данных на основе языка, предоставленного в запросе спящего режима. Это вопрос о сопоставлении спящего режима, но, пожалуйста, не стесняйтесь предлагать лучший дизайн базы данных, если я ошибаюсь.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;
}
Это работы вокруг, и мне интересно, что будет надлежащим способ сделать это?