为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate-使用复合键坚持@OneToOne

Hibernate-使用复合键坚持@OneToOne

慕容708150 2021-04-27 17:18:18
我具有以下“审核”表,该表可以承载有关我的架构的任何其他类的审核信息:CREATE TABLE `audit` (  `table_name` varchar(45) NOT NULL,  `item_id` int(11) NOT NULL,  `version` int(11) NOT NULL,  `updated_at` datetime NOT NULL,  `updated_by` varchar(25) NOT NULL,  `comment` varchar(255) DEFAULT NULL,  PRIMARY KEY (`table_name`,`item_id`,`version`))然后,我的架构中有不同的JPA实体,如下所示:@Entity(name = "EntityA")@Table(name = "entity_a")public class EntityA {    @Id    @GeneratedValue    private Long id;    private Long version;    // Other fields    @OneToOne(mappedBy = "id.item", targetEntity = EntityAAudit.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)    private EntityAAudit audit;}同时,我有一个抽象类Audit,它是多个特定于实体的审计类的超类:@MappedSuperclass@Table(name = "audit")@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name = "table_name", discriminatorType = DiscriminatorType.STRING)@DiscriminatorOptions(insert = true, force = true)public abstract class AuditHistory {    // Some audit fields like the date and the author of the modification}@Entity(name = "EntityAAudit")@Table(name = "audit")@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorValue("entity_a")@DiscriminatorOptions(insert = true, force = true)public class EntityAAudit extends Audit {    @EmbeddedId    @JsonUnwrapped    private AuditedId id;    @Embeddable    public static class AuditedId implements Serializable {        @OneToOne        @JoinColumn(name = "item_id", nullable = false)        private EntityA item;        @Column(name = "version", nullable = false)        private Long version;    }}我最终遇到以下异常:org.hibernate.id.IdentifierGenerationException: null id generated for:class EntityAAudit我从字面上尝试一切我能想到的还是网上找的,最终它总是归结为同一个问题:Hibernate试图插入我的Audit目标与空值item_id和version。
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

您可以尝试“派生身份”映射:


@Entity(name = "EntityAAudit")

@Table(name = "audit")

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

@DiscriminatorValue("entity_a")

@DiscriminatorOptions(insert = true, force = true)

public class EntityAAudit extends Audit {


    @EmbeddedId

    @JsonUnwrapped

    private AuditedId id;


    @OneToOne

    @JoinColumn(name = "item_id", nullable = false)

    @MapsId("entityAId") // maps entityAId attribute of embedded id

    private EntityA item;


    @Embeddable

    public static class AuditedId implements Serializable {

        private Long entityAId; // corresponds to PK type of EntityA


        @Column(name = "version", nullable = false)

        private Long version;

    }


}

注意上的@MapsId注释EntityAAudit.item。


另外,您将需要显式设置EntityAAudit.item和AuditedId.version。JPA不会为您神奇地确定和设置任何循环引用。

JPA 2.2规范的第2.4.1节中讨论了派生身份(带有示例)。


查看完整回答
反对 回复 2021-05-12
  • 1 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信