带有复合主键的 JPA @OneToMany

我需要使用 JPA 映射以下我无法更改的旧式数据库表结构。 表 ao_rda_acq (1) -> ao_rda_acq_righe (many) (purchase requisition -> purchase requisition rows) 是一对多的关系

表 (1)

create table ao_rda_acq
(
    id_divisione     varchar(4)  not null,esercizio        smallint    not null,id_rda           varchar(10) not null,...
    other fields
    ...
    constraint pk_ao_rda_acq
        primary key (id_divisione,esercizio,id_rda)   
)   

桌子很多

create table ao_rda_acq_righe
(
    id_divisione     varchar(4),nr_riga          integer     not null,...
    other fields
    ... 
    constraint pk_ao_rda_righe
        primary key (id_divisione,id_rda,nr_riga),constraint ao_rda_acq_righe_ao_rda_acq_id_divisione_esercizio_id_rda_fk
        foreign key (id_divisione,id_rda) references ao_rda_acq     
)

表ao_rda_acq的主键关系之一有3个字段id_divisione,id_rda。表端的主键很多关系都有相同的3个字段加上第4个字段nr_riga。

我尝试使用复合主键的@IdClass 注释使用此 JPA 方法

@Table(name="ao_rda_acq")
@Entity
@IdClass(RdaId.class)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rda {

    @Id
    public String idDivisione;
    @Id
    public Integer esercizio;
    @Id
    public String idRda;
    
    @OneToMany(
            cascade = CascadeType.ALL,orphanRemoval = true
    )
    @JoinColumns({
        @JoinColumn(name="id_divisione",referencedColumnName = "id_divisione"),@JoinColumn(name="esercizio",referencedColumnName = "esercizio"),@JoinColumn(name="id_rda",referencedColumnName = "id_rda")
    })
    @OrderBy("nrRiga")
    public List<RdaRiga> righe = new ArrayList<>();     

    //Additional fields
}

哪里

public class RdaId implements Serializable {
    String idDivisione;
    Integer esercizio;
    String idRda;
}

行的实体是

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
@IdClass(RdaRigaId.class)
@Table(name = "ao_rda_acq_righe")
public class RdaRiga {

    @Id
    public String idDivisione;
    @Id
    public Integer esercizio;
    @Id
    public String idRda;
    @Id
    public Long nrRiga; 
    
    //More fields
}

哪里

public class RdaRigaId implements Serializable {
    String idDivisione;
    Integer esercizio;
    String idRda;
    Long nrRiga;
}

此代码可以编译,但启动时 JPA 会出现此消息

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: invocation of init method failed; nested exception is org.hibernate.DuplicateMappingException: Table [ao_rda_acq_righe] contains physical column name [id_divisione] referred to by multiple logical column names: [id_divisione],[idDivisione]

这是映射我不满意的数据库结构的最佳方法吗?如果是这样,我错过了什么?

youcansayyes 回答:带有复合主键的 JPA @OneToMany

当您使用没有 @Id 注释的 @Column 时,列的名称被假定为带注释的属性的名称。 鉴于您的 DB 列似乎是 *id_divisione*,您还需要使用注释 @Column(name = "id_divisione")

这也适用于用 @Id 注释的其他属性。

本文链接:https://www.f2er.com/1702.html

大家都在问