2

我是 Play 框架和 yml 表示法的新手,只知道 Hibernate 的基础知识。我正在尝试使用 .yml 文件设置一些测试数据。我尝试定义几个 Question 对象和一个 ActiveCompetition 对象,它们引用同一个 Competition 对象。我的 .yml 文件看起来像这样(我已经删除了我认为不相关的内容):

ActiveCompetition(1): &myactivecompetition
    activeCompetition: &mycompetition
        name: Name of the competition

Question(11):
    title: Title 1
    competition: *mycompetition

Question(12):
    title: Title 2
    competition: *mycompetition

Question(13):
    title: Title 3
    competition: *mycompetition

我工作,但似乎Hibernate 保存了 *mycompetition 4 次

在 java bean 中,javax.persistence 的属性设置如下:

@Entity
@Transactional
public class ActiveCompetition extends Model {

   @Required
   @OneToOne(cascade= CascadeType.ALL)
   private Competition activeCompetition;
}

@Entity
@Transactional
public class Question extends Model {

    ...

    @Required
    @OneToOne(cascade= CascadeType.ALL)
    private Competition competition;
}

如何让 Hibernate 理解 *mycompetition 应该只在数据库中存储一次?我应该在 .yml 文件上写数据库 ID 吗?如果是这样,我该怎么做?我已经尝试在 activeCompetition 下添加例如“id:99”,但它没有帮助。

4

1 回答 1

1

有两个可能的问题:

第一个是您要声明关系 OneToOne,然后在您的 YAML 文件中创建一个 ManyToOne 关系。OneToOne 表示每个 ActiveCompetition 最多有一个问题,每个问题最多与一个 ActiveCompetition 相关。

你想要的是一个多对一关系,其中 ActiveCompetition 有很多问题。您应该更新您的 Java 代码。

第二个是您将 ActiveCompetition 定义为:

ActiveCompetition(1)

在 YAML、AFAIK 中,您通过实体提供的引用引用文件中的其他实体(或者我就是这样做的)。在上面的声明中,引用是1() 之间的数字。

因此,您应该将文件更改为:

Question(13):
    title: Title 3
    competition: 1
于 2012-04-25T07:49:07.627 回答