Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@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

  • TEST
    • ID
    • ...
    • EMBEDDED1_ID
    • EMBEDDED1_SOMEENUM
    • EMBEDDED2_ID
    • EMBEDDED2_SOMEENUM

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

like image 641
Pwnstar Avatar asked Sep 12 '25 02:09

Pwnstar


1 Answers

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;
like image 61
Simon Martinelli Avatar answered Sep 13 '25 21:09

Simon Martinelli