使用 JPA/Hibernate 将复合主键和外键与共享列映射

Ric*_*tek 5 hibernate jpa

我花了一段时间尝试使用复合主键和外键(共享 3 列中的 2 列)来计算以下 JPA/Hibernate 映射,但到目前为止还没有什么乐趣:(。

示例表如下(黄色键列包含 PK,蓝色键列包含 FK):

(摘要)当事人/客户表 人员表 附加消息表

到目前为止,我提供了以下映射(这种映射有效 - 它从数据库读取数据,但由于 updatable=false、insertable-false 而无法写入任何新的 Party-AdditionalMessage 关联):

...other imports...

import lombok.Getter;
import lombok.Setter;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(schema = "PARTY_TEMP_DATA", name = "PARTY")
@Getter
@Setter
public abstract class AbstractClientEntity implements PartyEntity, CreationTraceable, LastModificationTraceable {

    @AttributeOverride(name = "id", column = @Column(name = "PARTY_ID"))
    @AttributeOverride(name = "creationDateTime", column = @Column(name = "DATE_CREATED"))
    @EmbeddedId
    private PrimaryKey primaryKey;

    @OneToMany(mappedBy = "client")
    private List<AdditionalMessageEntity> additionalMessageList;

    ...other attributes follow...
}

...other imports...

import lombok.Getter;
import lombok.Setter;

@Entity
@Table(schema = SCHEMA_NAME, name = "PERSON")
@PrimaryKeyJoinColumn(name = "PARTY_ID", referencedColumnName = "PARTY_ID")
@PrimaryKeyJoinColumn(name = "PARTY_CREATED", referencedColumnName = "DATE_CREATED")
@PrimaryKeyJoinColumn(name = "RETENTION_LEVEL_ID", referencedColumnName = "RETENTION_LEVEL_ID")
@Getter
@Setter
public class PersonClientEntity extends AbstractClientEntity {

    @Column(name = "BIRTHDATE")
    private LocalDate birthDate;

    ...other attributes...    
}

...other imports...

import lombok.Getter;
import lombok.Setter;

@Entity
@Table(schema = SCHEMA_NAME, name = "ADDITIONAL_MESSAGE")
@Getter
@Setter
public class AdditionalMessageEntity implements PartyEntity {

    @AttributeOverride(name = "id", column = @Column(name = "ADDITIONAL_MESSAGE_ID"))
    @EmbeddedId
    private PrimaryKey primaryKey;

    private String value;

    @ManyToOne
    @JoinColumn(name = "PARTY_ID", referencedColumnName = "PARTY_ID", insertable = false, updatable = false)
    @JoinColumn(name = "PARTY_CREATED", referencedColumnName = "DATE_CREATED", insertable = false, updatable = false)
    @JoinColumn(name = "RETENTION_LEVEL_ID", referencedColumnName = "RETENTION_LEVEL_ID", insertable = false, updatable = false)
    private AbstractClientEntity client;
}
Run Code Online (Sandbox Code Playgroud)

最后,这是 PrimaryKey 类:

...other imports...

import lombok.Data;
import lombok.NoArgsConstructor;

@Embeddable
@Data
@NoArgsConstructor
public class PrimaryKey implements Serializable {

    /**
     * Actual (unique) primary key.
     */
    private Integer id;

    /**
     * Timestamp of the record creation, used for partitioning
     */
    @Column(name = "PARTY_CREATED")
    private LocalDateTime creationDateTime;

    /**
     * Data retention level, used for subpartitioning
     */
    @Column(name = "RETENTION_LEVEL_ID")
    private Integer retentionLevelId;
}
Run Code Online (Sandbox Code Playgroud)

我发现了一个类似的问题,这表明我应该使用 @MapsId 注释(请参阅Hibernate - Composite Primary Key containsforeign Key),但到目前为止我所有的尝试都失败了:( - 主要问题是 @MapsId 只能应用于一个属性/一次,而我有两个共享列。

任何好的提示表示赞赏