0

我有通常的客户表,但我希望能够让客户选择一个头衔(如先生、夫人、博士等)。

然而,该网站是多语言的。无论他选择什么标题,我都想用与他或她正在浏览网站的语言对应的标题来称呼他。

所以我想像:

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

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

4

3 回答 3

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;

    ....
}
于 2013-04-30T14:16:42.113 回答
0

首先,您需要一个表格来映射等效标题。即国际化标题和arch-title之间的映射。用映射播种。

然后,我将有一个@JoinColumn用于 Arch-title 的@Transient字段,以及一个用于国际化标题的字段。然后指定一个@PrePersist处理程序以使用瞬态字段来查找和设置拱标题。从那时起,您可以使用arch-title。

于 2013-04-30T14:27:04.193 回答
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;
}

标题类:

@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}  
于 2013-05-02T16:23:44.317 回答