返回
JPA 和 Hibernate 中的复合键:映射、操作和常见问题解答
java
2024-03-22 17:46:17
使用 JPA 和 Hibernate 映射复合键
什么是复合键?
复合键是一个由多个列组成的键,用于唯一标识数据库表中的记录。它克服了仅使用单个列作为主键的局限性,特别是当多个记录可能在该列上具有相同值时。
如何使用 JPA 和 Hibernate 映射复合键
JPA 实体类
首先,在 JPA 实体类中定义一个嵌入式复合键类:
@Entity
@Table(name = "Time")
public class Time {
@EmbeddedId
private TimeKey id;
}
@Embeddable
public class TimeKey {
private int levelStation;
private int confPathID;
}
Hibernate 配置
在 Hibernate 配置文件中,指定复合键策略:
<hibernate-mapping>
<class name="com.example.Time">
<composite-id>
<key-property name="levelStation" />
<key-property name="confPathID" />
</composite-id>
</class>
</hibernate-mapping>
CRUD 操作
使用复合键执行 CRUD 操作:
// 保存实体
Time time = new Time();
time.setId(new TimeKey(1, 2));
entityManager.persist(time);
// 查找实体
Time foundTime = entityManager.find(Time.class, new TimeKey(1, 2));
// 更新实体
foundTime.setDistance(100);
entityManager.merge(foundTime);
// 删除实体
entityManager.remove(foundTime);
优点**
- 确保记录的唯一性,即使在单个列上具有相同值时也是如此。
- 简化查询,因为可以使用复合键作为过滤条件。
- 提高性能,因为复合键可以创建更有效的索引。
常见问题解答
-
什么时候应该使用复合键?
当单个列不足以唯一标识记录时。 -
复合键可以有多个列吗?
是的,复合键可以包含任意数量的列。 -
Hibernate 支持哪些复合键策略?
Hibernate 支持以下策略:COMPOSITE_ID
、JDBC_COMPOSIT_ID
和READ_ONLY
。 -
复合键的缺点是什么?
复合键可能需要创建额外的索引,这可能会影响性能。 -
复合键是可变的吗?
复合键通常被视为不可变的,但有些情况需要更改键,例如当更新数据时。