当前位置: 首页 > 面试题库 >

Java如何使用Hibernate映射组合键?

史骏
2023-03-14
问题内容

在此代码中,如何为组合键生成Java类(如何在hibernate状态下组合键):

create table Time (
     levelStation int(15) not null,
     src varchar(100) not null,
     dst varchar(100) not null,
     distance int(15) not null,
     price int(15) not null,
     confPathID int(15) not null,
     constraint ConfPath_fk foreign key(confPathID) references ConfPath(confPathID),
     primary key (levelStation, confPathID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

问题答案:

要映射组合键,你可以使用EmbeddedId 或在IdClass注解。我知道这个问题不仅仅涉及JPA,但规范定义的规则也适用。因此,它们是:

2.1.4主键和实体身份

组合主键必须对应于单个持久性字段或属性,或对应于如下所述的一组此类字段或属性。必须定义一个主键类来表示一个复合主键。当数据库密钥由几列组成时,从传统数据库进行映射时,通常会出现复合主键。的EmbeddedId和 IdClass注解用于表示复合主键。参见9.1.14和9.1.15节。

以下规则适用于复合主键:

  • 主键类必须是公共的,并且必须具有公共的无参数构造函数
  • 如果使用基于属性的访问,则主键类的属性必须是公共的或受保护的。
  • 主键类必须为serializable
  • 主键类必须定义equalshashCode 方法。这些方法的值相等的语义必须与键映射到的数据库类型的数据库相等一致。
  • 复合主键必须表示并映射为可嵌入类(请参见第9.1.14节“ EmbeddedId注释”),或者必须表示并映射至实体类的多个字段或属性(请参见第9.1.15节“ IdClass”)注解”)。
  • 如果组合主键类映射到实体类的多个字段或属性,则主键类中的主键字段或属性名称与实体类的名称必须对应,并且它们的类型必须相同。

With an IdClass

复合主键的类可能看起来像(可以是静态内部类):

public class TimePK implements Serializable {
    protected Integer levelStation;
    protected Integer confPathID;

    public TimePK() {}

    public TimePK(Integer levelStation, Integer confPathID) {
        this.levelStation = levelStation;
        this.confPathID = confPathID;
    }
    // equals, hashCode
}

And the entity:

@Entity
@IdClass(TimePK.class)
class Time implements Serializable {
    @Id
    private Integer levelStation;
    @Id
    private Integer confPathID;

    private String src;
    private String dst;
    private Integer distance;
    private Integer price;

    // getters, setters
}

该IdClass注释映射多个字段的表PK。

With EmbeddedId

复合主键的类可能看起来像(可以是静态内部类):

@Embeddable
public class TimePK implements Serializable {
    protected Integer levelStation;
    protected Integer confPathID;

    public TimePK() {}

    public TimePK(Integer levelStation, Integer confPathID) {
        this.levelStation = levelStation;
        this.confPathID = confPathID;
    }
    // equals, hashCode
}

和实体:

@Entity
class Time implements Serializable {
    @EmbeddedId
    private TimePK timePK;

    private String src;
    private String dst;
    private Integer distance;
    private Integer price;

    //...
}

@EmbeddedId注解映射一个PK类表PK。

差异:

  • 从物理模型的角度来看,没有区别
  • @EmbeddedId通过某种方式可以更清楚地传达出该密钥是组合密钥,而当组合的pk本身是有意义的实体或在代码中重用时,IMO便有意义。
  • @IdClass 用来指定某些字段组合是唯一的,但这些字段没有特殊含义。
    它们还会影响你编写查询的方式(使它们或多或少变得冗长):

with IdClass

select t.levelStation from Time t

with EmbeddedId

select t.timePK.levelStation from Time t


 类似资料:
  • 问题内容: 在此代码中,如何为组合键生成Java类(如何在休眠状态下组合键): 问题答案: 要映射组合键,你可以使用 或在注解。我知道这个问题不仅仅涉及,但规范定义的规则也适用。因此,它们是: 2.1.4主键和实体身份 … 组合主键必须对应于单个持久性字段或属性,或者对应于如下所述的一组此类字段或属性。必须定义一个主键类来表示一个复合主键。当数据库密钥由几列组成时,从传统数据库进行映射时,通常会出

  • 问题内容: 您能帮我使用Hibernate映射此类吗? 我正在使用PostgreSQL,表中的列类型是integer []应该如何映射我的数组? 问题答案: 我从未将数组映射为hibernate状态。我总是使用收藏集。因此,我对您的课程进行了一些更改:

  • 问题内容: 有没有人通过Hibernate成功将PostgreSQL中的数字数组映射到Java中的数字数组? sql: 映射: 类: 查询表时出现异常。 问题答案: Hibernate不支持开箱即用的数据库阵列(例如,映射到的数据库阵列)。 Hibernate提供的类型和类型用于将Java数组映射到支持表- 它们基本上是一对多/元素集合映射的变体,所以这不是您想要的。 最新的PostgreSQL的

  • 问题内容: 使用Hibernate,可以创建一个组合ID,其中要映射到该ID的列之一可以为空值吗? 这是为了处理具有唯一键的旧表,该键可以具有空值,但不能具有主键。 我意识到我可以只向表中添加一个新的主键列,但是我想知道是否有任何方法可以避免这样做。 问题答案: 否。主键不能为null。

  • 问题内容: 我有一个颜色枚举 我有包含它的MyEntity。 我已经有一个UserType来映射我的枚举。 您知道如何在Hibernate hbm.xml中映射枚举集吗? 我需要UserType还是最简单的方法? 谢谢 编辑: 只是为了说明一下,我正在寻找 hbm.xml 配置而不是@CollectionOfElements注释 问题答案: 我使用EnumSet映射线程中的解决方案,该解决方案依赖

  • 当使用 Declarative 样式是在许多类之间共享一些功能,例如一组公共列、一些公共表选项或其他映射属性。标准的Python习惯用法是让类继承自一个包含这些常见特性的超类。 当使用声明性映射时,通过使用mixin类,以及通过增加 registry.generate_base() 方法或 declarative_base() 功能。 下面是一些常见的混合成语的例子: from sqlalchem