问题描述
我有一些我想与 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 内重叠。因此,id
和 from
的组合是唯一的。
在 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 (将#修改为@)