我有通常的客户表,但我希望能够让客户选择一个标题(如Mr.,Mrs.,Dr.等)。
然而,该网站是多语言的。无论他选择什么头衔,我都希望用他与她正在浏览网站的语言相同的标题来解决他。
所以我想象的是:
Customer CustomerTitles
-------- --------------
titleId -------| id
firstName |-------- titleId
lastName locale
titleDescription
关于如何使用hibernate注释实现类的任何想法?
答案 0 :(得分:0)
似乎一个CustomerTitle可以属于许多客户,因此它可以通过以下方式与ManyToOne关系(与客户在一起)映射:
@Entity
@Table(name="Customer")
public class Customer
{
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private int id;
private String firstName;
private String lastName;
@ManyToOne
@JoinColumn(name="titleId")
private CustomerTitle title;
....
}
@Entity
@Table(name="CustomerTitles")
public class CustomerTitle
{
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private int id;
private String title;
private String locale;
private String titleDescription;
....
}
答案 1 :(得分:0)
首先,您需要一张表来映射相应的标题。也就是说,国际化标题和拱门标题之间的地图。用映射来种下这个。
然后我会为arch-title设置一个@JoinColumn
字段,为国际化标题设置一个@Transient
字段。然后指定@PrePersist
处理程序以使用瞬态字段查找并设置arch-title。从那时起,您可以使用arch-title。
答案 2 :(得分:0)
我的做法和结果是:
Customer Title TitleLocalization
-------- ------ -----------------
id |---1 id 1---| id
titleId N---| |---N titleId
firstName locale
lastName title (localized)
客户类:
@Entity
public class Customer implements Serializable {
@ManyToOne(fetch = FetchType.EAGER)
private Title title;
}
Title类:
@Entity
public class Title implements Serializable {
@OneToMany(mappedBy = "title", fetch = FetchType.EAGER)
@MapKey(name = "locale")
private Map<Locale, TitleLocalization> localized;
}
TitleLocalization类:
@Entity
public class TitleLocalization implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
private Title title;
private Locale locale;
private String traslation;
所以我可以“轻松”从视图中获取翻译的客户名称:例如。
#{login.currCustomer.title.localized.get(localeManager.currLocale).title}