0

hibernateクエリで提供されるロケールに基づいてデータベースから国際コンテンツを取得したい。これは休止状態のマッピングに関する質問ですが、私が間違っている場合は、より良いデータベース設計を提案してください。国際化されたデータベースのHibernateマッピング

私のDB設計(簡体字): db design だから私は翻訳された内容を含む、翻訳可能なデータと追加のテーブルを持つテーブルを持っていますが、言語の区別のための追加フィールド「ロケール」と。

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 

私は、単一のクエリで一台の車を取得することができるようにしたい:

マイJavaクラスは次のようになります。通常の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; 
} 

何このセットアップのために休止状態の注釈マッピングとクエリでしょうか?私はいくつかの試みを試みたが役に立たなかった。現在、私の最高の試みは以下の通りだった:

マッピング:

@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