Hibernate-使用复合键坚持@OneToOne

我具有以下“审核”表,该表可以承载有关我的架构的任何其他类的审核信息:


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。


慕容708150
浏览 183回答 1
1回答

德玛西亚99

您可以尝试“派生身份”映射:@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节中讨论了派生身份(带有示例)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java