@Embeddable 和 @ManyToOne

Spe*_*ius 4 hibernate jpa embeddable

想象一下接下来的课程

@Embeddable
class A {
    @ManyToOne
    public B classB;

    ...
    public State someEnum;
}

@Entity
@Table(name = "TEST")
class B {
    public long id;
    //... some data


   @Embedded
   @AttributeOverrides({
        @AttributeOverride(
                name = "classB.id",
                column = @Column(name = "EMBEDDED1_ID")
        ),
        @AttributeOverride(
                name = "someEnum",
                column = @Column(name = "EMBEDDED1_SOMEENUM")
        )
   })
   public A embedded1;

   @Embedded
   @AttributeOverrides({
        @AttributeOverride(
                name = "classB.id",
                column = @Column(name = "EMBEDDED2_ID")
        ),
        @AttributeOverride(
                name = "someEnum",
                column = @Column(name = "EMBEDDED2_SOMEENUM")
        )
   })
   public A embedded2;
}
Run Code Online (Sandbox Code Playgroud)

所以我期望数据库表看起来像

  • 测试
    • ID
    • ...
    • 嵌入1_ID
    • 嵌入1_SOMEE​​NUM
    • 嵌入2_ID
    • 嵌入2_SOMEE​​NUM

但如果失败:

引起原因:org.hibernate.MappingException:实体映射中的重复列:ClassB 列:classB_id(应使用 insert="false" update="false" 进行映射)

版本:

Hibernate:5.2.12.FINAL JPA:hibernate-jpa-2.1-api

Sim*_*lli 7

您不能使用@AttributeOverride 重命名外键列。你必须使用@AssosiactionOverride

@Entity
@Table(name = "TEST")
public class B {

    public long id;

    @AssociationOverride(name = "classB", joinColumns = @JoinColumn(name = "EMBEDDED1_ID"))
    @AttributeOverrides({
            @AttributeOverride(
                    name = "someEnum",
                    column = @Column(name = "EMBEDDED1_SOMEENUM")
            )
    })
    @Embedded
    public A embedded1;

    @AssociationOverride(name = "classB", joinColumns = @JoinColumn(name = "EMBEDDED2_ID"))
    @AttributeOverrides({
            @AttributeOverride(
                    name = "someEnum",
                    column = @Column(name = "EMBEDDED2_SOMEENUM")
            )
    })
    @Embedded
    public A embedded2;
Run Code Online (Sandbox Code Playgroud)