我需要将 1:N 关系(在数据库上)映射为 1:1(在 Java 类上)。
让我解释一下:假设有 2 个实体,人员和地址。
一个人可能有许多地址(1:N 部分),但这些地址中只有一个是当前的‡(根据某些标准,可能是一个指示其货币的布尔标志或几个“不早于”和“不晚于”的日期字段) ”)。
在 SQL 中,我想要类似的东西:
SELECT p.*, a.* FROM Person p LEFT JOIN Address a ON (p.id = a.person_id AND a.is_valid = TRUE)
有一个限制,即没有一个地址或最多一个地址有效。这是在其他地方强制执行的。
如何声明Person->Address关系?
我知道连接标准是上面的
p.id = a.person_id
部分。但我需要添加额外的谓词(上面示例中的a.is_valid = TRUE
)。
此外,这个谓词必须与 join 子句结合在一起(而不是在获取后应用的过滤器),因为存在当前没有有效地址的人的情况(尽管过去可能有很多地址)。
@Entity class Address { /* ... */}
@Entity class Person {
/* @WhatToPutHere? */
private Address currentAddress;
}
‡ 想想对以前地址的审计跟踪做得不好。
您的实体中可以同时拥有两者。当前地址和所有地址列表。
@Entity
public class Person {
/* anyother properties */
@OneToOne
@JoinColumn(name = "current_address_id")
private Address currentAddress;
@OneToMany(mappedBy = "person")
private Set<Address> addresses;
}