返回

JPA 和 Hibernate 中的复合键:映射、操作和常见问题解答

java

使用 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);

优点**

  • 确保记录的唯一性,即使在单个列上具有相同值时也是如此。
  • 简化查询,因为可以使用复合键作为过滤条件。
  • 提高性能,因为复合键可以创建更有效的索引。

常见问题解答

  1. 什么时候应该使用复合键?
    当单个列不足以唯一标识记录时。

  2. 复合键可以有多个列吗?
    是的,复合键可以包含任意数量的列。

  3. Hibernate 支持哪些复合键策略?
    Hibernate 支持以下策略:COMPOSITE_IDJDBC_COMPOSIT_IDREAD_ONLY

  4. 复合键的缺点是什么?
    复合键可能需要创建额外的索引,这可能会影响性能。

  5. 复合键是可变的吗?
    复合键通常被视为不可变的,但有些情况需要更改键,例如当更新数据时。