4

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

Pwnstar
  • 2,333
  • 2
  • 29
  • 52
  • You embed two times class A that has a reference to class B. Now the ManyToOne in A results in two foreign keys to B with the same name classB_id. But there is no way to solve this problem. Your construct is a bit strange. – Simon Martinelli Jan 11 '18 at 11:20
  • I an old version this happened to work. I don't know why but after I updated it it's now changed to not work anymore. I used @AttributeOverride and hoped it would be gone, but it seems hibernate does not rename it internally and still uses the classB_id which leads to the error. Am I right? – Pwnstar Jan 11 '18 at 11:53
  • And yes it's strange. But I didn't implement it.... I was forced to work on this project ;-) – Pwnstar Jan 11 '18 at 12:00

1 Answers1

7

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;
Simon Martinelli
  • 34,053
  • 5
  • 48
  • 82