hibernatejpaembeddable

@Embeddable with @ManyToOne


Imagine following classes

@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;
}

So I am expectingthe database table to look like

But if fails with:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: ClassB column: classB_id(should be mapped with insert="false" update="false")

Versions:

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


Solution

  • You cannot use @AttributeOverride to rename the foreign key column. You have to use @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;