Java 这一JPA战略有效吗?

Java 这一JPA战略有效吗?,java,database,spring,hibernate,jpa,Java,Database,Spring,Hibernate,Jpa,我正在尝试使用Spring数据、Hibernate和JPA框架为一个类使用以下设计。请注意,@GeneratedValue和@Id注释位于不同的列上 @Data @Entity @Table(name = "ACCTS") public class MyAccount implements java.io.Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="ACCOU

我正在尝试使用Spring数据、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;

}
这张桌子看起来像这样。请注意,主键约束不在标识列上

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似乎在标识列方面有问题-标识值从未创建。此外,如果我尝试进行更新,会出现“重复主键”错误

有人用JPA和Hibernate成功地做到了这一点(拆分标识列和主键列)吗?

简短的回答是“没有-这不起作用”。从逻辑上讲,除了作为主键的一部分之外,没有理由使用标识列,而且这个实现在JPA中根本不起作用(至少,我没能让它工作


简而言之:避免。

也许我不理解你的问题。
@Id
指定主键。这在JPA中是不允许的,但在其他提供商中是可能的-EclipseLink允许指定退货策略。Hibernate可能有它自己的等效项。但我不确定这一点,因为accountId将唯一标识实体,所以nd so可以用作ID。ID可以不同于表的pk,只要它是唯一的。是的,我知道这很疯狂,但这是我得到的表结构。只是想让它工作(并且没有太多运气)。即使每个id都是唯一的,您也可以将其称为a和愚人JPA,只要它们都不为null且其中一个是唯一的。@Pace-不幸的是,HSQLDB不可能。