0

Je souhaite obtenir du contenu international à partir de la base de données en fonction des paramètres régionaux fournis dans la requête Hibernate. Ceci est une question sur la cartographie d'hibernation, mais n'hésitez pas à proposer une meilleure conception de base de données si la mienne est fausse.Mise en correspondance Hibernate de la base de données internationalisée

Ma conception de DB (simplifié): db design J'ai donc table avec des données non traduisibles et table supplémentaire avec le contenu traduit mais avec un champ supplémentaire « locale » pour la distinction de la langue.

Mes classes java ressemble à ceci:

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 

Je veux être en mesure d'obtenir une voiture avec requête unique. Avec jdbc régulière, je voudrais utiliser quelque chose comme ça requête 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; 
} 

Quelle serait une cartographie d'annotation de mise en veille prolongée et requête pour cette configuration? J'ai essayé plusieurs tentatives mais en vain. À l'heure actuelle ma meilleure tentative était comme ci-dessous:

Cartographie:

@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; 

OAC:

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; 
} 

Ceci est un travail autour et je me demande ce qui serait un bon façon de le faire?

Répondre

0

Vous devez avoir une annotation sur les deux colonnes lors du mappage vers un FK. (JavaDoc)