在 Hibernate 中加入时态表

问题描述

我有一些我想与 Hibernate 一起使用的时态表。我现有的数据库架构如下所示,无法更改:

夫人从 2000 年到 2022 年,史密斯是我们的客户。她有两份合同。 2020 年 11 月 16 日,她结婚并更名为米勒。

客户:

密钥 id 开始 结束 姓名
1 1 2000-01-01 2020-11-15 史密斯
2 1 2020-11-16 2022-12-31 米勒

合同:

密钥 id 开始 结束 标题 客户 ID
1 1 2000-01-01 2022-12-31 第一份合同 1
2 2 2002-01-01 2018-12-31 第二份合同 1

pkey 是唯一的自动递增值。 id 每个时间数据集都是唯一的。持续时间不能在一个 ID 内重叠。因此,idfrom 的组合是唯一的。

sql 中,我只需编写以下查询并将所需日期作为参数传递。 (同一日期4次)

SELECT contract.caption,customer.name FROM contract JOIN customer ON contract.customerId = customer.id
WHERE contract.start >= ? AND contract.end <= ? AND customer.start >= ? AND customer.end <= ?

我的问题是将关系映射到 Hibernate。一份合同有一个客户,在不同的日期有不同的名字。

我尝试过的:

  • @Id 设置为不唯一的 id。这(可以理解)会导致各种奇怪的行为。
  • @Id 上将 pkey 设置为 @JoinColumn(referencedColumnName = "id")@ManyToOne。导致我的单元测试出现问题,其中 Hibernate 创建模式 (hibernate.hbm2ddl.auto=create-drop)。对于每个关系,它添加一个约束,即 id 必须是唯一的。
  • 使用 @Embeddable 创建复合键并在 @JoinColumns({@JoinColumn(name = "customerId",referencedColumnName = "id")}) 上指定 @ManyToOne

在最后一次尝试(我认为最有希望的)之后,我的代码如下所示:

@Embeddable
public class State implements Serializable {
   @Column
   public long id;
   @Column
   public LocalDate start;
   @Column
   public LocalDate end;
}
@Entity
public class Customer {
   public long pkey;
   @EmbeddedId
   public State id;
   public String name;
   @OnetoMany
   public List<Contract> contracts;
}
@Entity
public class Contract {
   public long pkey;
   @EmbeddedId
   public State id;
   public String caption;
   @ManyToOne
   // I don't want to add start & end here because they should not be equal
   @JoinColumns({@JoinColumn(name = "customerId",referencedColumnName = "id")})
   public List<Contract> contracts;
}
LocalDate at = LocalDate.of(2020,NOVEMBER,15);
System.out.println(customerDao.findAll((root,query,criteriaBuilder) -> criteriaBuilder.and(
      criteriaBuilder.lessthanorEqualTo(root.get("id").get("start"),at),criteriaBuilder.greaterThanorEqualTo(root.get("id").get("end"),at)
)));

但这在启动时给出:referencedColumnNames(id) of Contract.customer referencing Customer not mapped to a single property

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)