Hibernate国际化用户标题

时间:2013-04-30 10:30:02

标签: hibernate jpa

我有通常的客户表,但我希望能够让客户选择一个标题(如Mr.,Mrs.,Dr.等)。

然而,该网站是多语言的。无论他选择什么头衔,我都希望用他与她正在浏览网站的语言相同的标题来解决他。

所以我想象的是:

Customer                        CustomerTitles                               
--------                        --------------
titleId     -------|            id
firstName          |--------    titleId
lastName                        locale
                                titleDescription

关于如何使用hibernate注释实现类的任何想法?

3 个答案:

答案 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}