【发布时间】:2013-07-24 19:43:47
【问题描述】:
我正在尝试将以下设计用于使用 Spring Data、Hibernate、JPA 框架的类。请注意,@GeneratedValue 和 @Id 注释位于不同的列上。
@Data
@Entity
@Table(name = "ACCTS")
public class MyAccount implements java.io.Serializable {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ACCOUNT_ID", nullable=false, precision=10, scale=0)
private long accountId;
@Id
@Column(name="ACCOUNT_NUMBER", unique=true, nullable=false, precision=9, scale=0)
private int accountNumber1;
@Column(name="PRIMARY_NUMBER", nullable=false, precision=9, scale=0)
private int accountNumber2;
}
桌子看起来像这样。请注意,PRIMARY KEY 约束不在 IDENTITY 列上。
CREATE TABLE CAACCTS (
ACCOUNT_ID BIGINT GENERATED BY DEFAULT AS IDENTITY ,
ACCOUNT_NUMBER DECIMAL(9, 0) DEFAULT 0 NOT NULL ,
PRIMARY_NUMBER DECIMAL(9, 0) DEFAULT 0 NOT NULL ,
CONSTRAINT XXX PRIMARY KEY( ACCOUNT_NUMBER ) ) ;
可以创建此表,但 JPA 似乎对 IDENTITY 列有问题 - 从未创建标识值。此外,如果我尝试进行更新,我会收到“DUPLICATE PRIMARY KEY”错误。
有没有人用 JPA 和 Hibernate 成功地完成了这个(拆分 IDENTITY 和 PRIMARY KEY 列)?
【问题讨论】:
-
也许我不明白你的问题。
@Id指定主键。 -
这在 JPA 中是不允许的,但在其他提供商中是可能的 - EclipseLink 允许指定退货政策。 Hibernate 可能有它自己的等价物。我不确定这一点,因为 accountId 将唯一标识实体,因此可以用作 ID。 ID 可以不同于表的 pk,只要它是唯一的。
-
是的,我知道这很疯狂,但这是给我的表结构。只是试图让它发挥作用(并没有太多运气)。
-
即使每个 id 都是唯一的,您也可以将其称为 composite primary key 并愚弄 JPA,只要它们都不为空且其中一个是唯一的。
-
@Pace- 不幸的是,HSQLDB 不可能。
标签: java database spring hibernate jpa