在此代码中,如何为组合键生成Java类(如何在休眠状态下组合键):
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节。
…
以下规则适用于复合主键:
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
@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。
用 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
用来指定某些字段组合是唯一的,但这些字段没有特殊含义。
它们还会影响您编写查询的方式(使查询或多或少变得冗长):
select t.levelStation from Time t
select t.timePK.levelStation from Time t
参考文献 * JPA 1.0规范 * 第2.1.4节“主键和实体标识” * 第9.1.14节“ EmbeddedId注释” * 第9.1.15节“ IdClass注释”
问题内容: 在此代码中,如何为组合键生成Java类(如何在hibernate状态下组合键): 问题答案: 要映射组合键,你可以使用EmbeddedId 或在IdClass注解。我知道这个问题不仅仅涉及JPA,但规范定义的规则也适用。因此,它们是: 2.1.4主键和实体身份 … 组合主键必须对应于单个持久性字段或属性,或对应于如下所述的一组此类字段或属性。必须定义一个主键类来表示一个复合主键。当数据
问题内容: 我正在尝试将Postgres自定义类型(名为transmission_result)映射到Hibernate / JPA POJO。postgres自定义类型或多或少是字符串值的枚举类型。 我创建了一个名为PGEnumUserType的自定义EnumUserType以及一个表示postgres枚举值的枚举类。当我对一个真实的数据库运行它时,我收到以下错误:’ERROR:列“状态”的类型
问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身
问题内容: 我的Java Bean具有childCount属性。此属性 未映射到数据库列 。取而代之的是,它应该 由数据库通过对Java bean及其子级的联接进行操作 的 函数 来 计算 。如果可以按需/“延迟”计算此属性,那就更好了,但这不是强制性的。 在最坏的情况下,我可以使用HQL或Criteria API设置此bean的属性,但我不希望这样做。 Hibernate 批注可能会有所帮助,但
问题内容: 我正在尝试确定是否有可能让JPA保留具有具体实现的抽象集合。 到目前为止,我的代码如下所示: 但是我一直在绊脚石下面的映射错误,我真的不知道这是否可行? 更新 我不认为问题出在抽象类上,而是 @MappedSuperClass 批注。看起来jpa不喜欢使用 @MappedSuperClass 映射一对多关系。如果我将抽象类更改为具体类,则会遇到相同的错误。 如果我然后更改为 @Enti
我有两个共享一个公共键的表。我想要的是,当我加载第一个表的类时,我还会得到对应于第二个表的类的列表,它们在第二个表中共享键。 更具体地说:tableA有一个id(id1),它存在于tableB的多个条目中。但是,tableB使用复合键并使用id1和id2作为键。 我想实现的是,当加载表A的POJO时,我还会得到表B的所有条目,其中表A中的id1等于表B中的id1。