我一直试图弄清楚如何在没有任何运气的情况下执行此操作,并且在Google上搜索时也找不到任何有用的信息。
我有三张桌子:
HOTEL
- id
- name
- local_id (foreign key)
DESCRIPTION
- id
- description
- hotel_id (foreign key)
- locale_id (foreign key)
LOCALE
- id
- local
我还有以下HOTEL 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 检索表 DESCRIPTION 中的数据,以填充说明在DAO模型酒店?
答案 0 :(得分:1)
那么,你还有HotelDescription 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(可能不是最好的)
喔。并确保使用@Id
注释id答案 1 :(得分:0)
我会考虑放弃Locale表并直接使用java.util.Locale。 Hibernate(不确定其他JPA实现)具有从char列到java.util.Locale的自动类型转换。这将看起来像:
DESCRIPTION
- id
- description
- hotel_id (foreign key)
- locale
和实体:
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 ??
}
}