将 JPA 2.1 中的 List 或 Set 用于同一个表中的多个列

Posted

技术标签:

【中文标题】将 JPA 2.1 中的 List 或 Set 用于同一个表中的多个列【英文标题】:Using List or Set in JPA 2.1 for multiple columns in same table 【发布时间】:2014-05-09 07:00:53 【问题描述】:

我是 JPA 的新手。 我正在使用 Wicket-Spring-Hibernate-JPA 构建示例 maven 项目。

我正在使用 Hibernate EntityManager:v4.3.5.Final。 我正在使用 JPA:v2.1-api。我正在使用数据库 mysql: v5.6。

当我编写模型类时,我想将表的多个列与模型类中的一个元素映射为 List 或 Set。

Database Table Name:  QUESTION_MAIN
Column Name : Type : PK
QID         : int : PK
QTYPE       : varchar
QUESTION    : varchar
OPTION1     : varchar
OPTION2     : varchar
OPTION3     : varchar
OPTION4     : varchar
OPTION5     : varchar
OPTION6     : varchar

注意:假设最多有 6 个选项可供提问。

现在在模型类中,我想这样表示:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="QUESTION_MAIN")
public class Question 

   @Id
   @GeneratedValue
   @Column(name="QID")
   private Long id;

   @Column(name="QTYPE")
   private String quest_type;

   @Column(name="QUESTION")
   private String question;

   //TODO: Create List or Set for OPTIONS

对于代码中的行:

//TODO: Create List or Set for OPTIONS

我想在这里为选项列创建一个列表或集合。

请让我知道任何可能的方法。 或者,如果有人知道这种情况,请提供任何替代方案。


你好路易吉, 我不确定您提供的上述链接能否解决我的问题。我仍然试图理解该链接中提供的选项。 我正在寻找的是,我能否在我们的 Bean 类中创建一个列表或一组列名作为一个元素(使用 JPA 注释)。

【问题讨论】:

Is it possible to dynamically define column names in Hibernate / JPA? 的可能重复项 【参考方案1】:

至少,需要将实体属性映射到表列。 所以只需要实体中每个 OPTIONS 的属性(变量、getter&setter);

...
@Column(name="OPTION") //here OPTION1, OPTION2, and so on
private String option;
...

另一种方法是为 OPTION 创建一个单独的表和一个实体来满足您的要求。 从Question 实体可以与Option 实体建立关系(one-to-many 单向或双向关系 - 以下示例使用bidirectional

@Entity
@Table(name="OPTION")
public class Option 
    @Id
    @GeneratedValue
    @Column(name="") //column name in table
    private Long id;

    @Column(name="")
    private String optionTitle; //can use enum for OPTION1, OPTION2, and so on

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

    @ManyToOne
    @JoinColumn(name = "QUESTION_ID", nullable = false)   //QUESTION_ID (whatever you defined foreign key column in Option table)
    private Question question;

    ..
    //constructor, getters & setters

在 Question 实体中,为选项集合添加属性(List、Set 和任何您需要的可排序集合)

@OneToMany(mappedBy = "question")
private List<Option> optionList = new ArrayList<Option>();

【讨论】:

谢谢。我将尝试使用您提供的其他选项。这将有助于解决问题。

以上是关于将 JPA 2.1 中的 List 或 Set 用于同一个表中的多个列的主要内容,如果未能解决你的问题,请参考以下文章

将 weblogic 升级到 JPA 2.1

jpa 2.1中的@ConstructorResult映射

从数据库向导 jpa 2.1 @ManyToMany 创建实体,不需要修复列表

您将如何使 JPA 2.1 模块独立于 JPA 实现?

日期之间的 JPA 2.1 CriteriaQuery

检查 Spring 数据 JPA 查询中的 List 参数是不是为空