JPA / Hibernate如何映射表示"应用程序属性的bean"

时间:2015-08-04 21:29:30

标签: java hibernate jpa repository-pattern

对于我正在进行的项目(cms解决方案),我有一个表存储用户网站的所有属性(由cms管理)。

该表有这个DDL:

CREATE TABLE SITE_OPTIONS(
    OPTION_ID int generated always as identity PRIMARY KEY,
    OPTION_NAME varchar(200) not null,
    OPTION_VALUE text,
    LANGUAGE_ID int not null
)

这是表格内容的一个例子:

+-----------++---------------++------------------++-------------+
| OPTION_ID || OPTION_NAME   || OPTION_VALUE     || LANGUAGE_ID |
+-----------++---------------++------------------++-------------+
|         1 || SITE_TITLE    || My site title    ||           1 |  
+-----------++---------------++------------------++-------------+
|         2 || SITE_SUBTITLE || My site subtitle ||           1 |  
+-----------++---------------++------------------++-------------+
|         3 || TEMPLATE      || interior_designer||           1 |  
+-----------++---------------++------------------++-------------+

我想要的或者更好的是一个代表" siteoptions"的bean:

public class SiteOptions{
    private String siteTitle;

    private String siteSubtitle;

    private String template;

    //getters/setters
}

我已经有了一个基于存储库的架构(经典的存储库模式impl),我可以用它来实现读/保存功能。

你知道我是否可以用纯JPA / Hibernate来实现这个目标吗?

或者你曾经遇到过这种情况吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

保存SiteOptions时,只需将选项矩阵转置为与数据库表结构对应的实体类:

@Entity
public class SiteOptionEntity {
   @Id
   @Column(name = "OPTION_ID")
   private Long id;

   @Column(name = "OPTION_NAME")
   private String name;

   @Column(name = "OPTION_VALUE")
   private String value;

   @ManyToOne
   @JoinColumn(name = "LANGUAGE_ID")
   private Language language;
   ...
}

当然,使用适当的id生成器并决定是否引入单独的Language实体(如上所示)或仅使用语言ID。