hibernate - how to JoinColumn an EmbeddedId
Matthew Barrera
Situation: I have a masterDB and a library1DB and library2DB.
library1DB and library2DB are two separate database but has the same schema because each library must have their own database. Now we have a masterDB, this is an aggregated version of all the data in all libraries (library1DB and library2DB), still taking note of their respective ids and mapping them to their library id.
Here's I want my tables to be structured: book - book_id - library_id - title - shelf_id shelf - shelf_id - library_id - book_id - description
I have these models:
@Entity
public class Book { @EmbeddedId private BookKey bookKey; @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "SHELF_ID", referencedColumnName = "SHELF_ID"), @JoinColumn(name = "LIBRARY_ID", referencedColumnName = "LIBRARY_ID") }) private ObjectA objectA; @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "ANOTHER_ID", referencedColumnName = "ANOTHER_ID"), @JoinColumn(name = "LIBRARY_ID", referencedColumnName = "LIBRARY_ID") }) private ObjectB objectB; @Column private String title;
}
@Embeddable
public class BookKey implements Serializable { @Column(name = "BOOK_ID") private long bookId; @Column(name = "LIBRARY_ID") private long libraryId;
}But I get this exception:
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Book column: library_id (should be mapped with insert="false" update="false")I've tried using @IdClass instead of @Embeddable and @EmbeddedId, and I got this:
Caused by: org.hibernate.DuplicateMappingException: Table [book] contains physical column name [libraryId] represented by different logical column names: [libraryId], [LIBRARY_ID]Any help?
Thanks!
2 Answers
You should add insert="false", update="false" for the second mapped column library_id.
Try this:
@JoinColumn(name = "LIBRARY_ID", referencedColumnName = "LIBRARY_ID", insertable = false, updatable = false) 3 I was getting the same problem. If you add insert="false", update="false" only to one, you will get an exception stating that you mixed writable and non-writables and that this is not allowed. The following works:
I solved it using the @PrimaryKeyJoinColumns, try this (from another example):
@ManyToOne
@PrimaryKeyJoinColumns(value = { @PrimaryKeyJoinColumn(name = "country_code", referencedColumnName = "country_code"), @PrimaryKeyJoinColumn(name = "zip_code", referencedColumnName = "code")
})
private Zip zip;
@ManyToOne
@PrimaryKeyJoinColumns(value = { @PrimaryKeyJoinColumn(name = "country_code", referencedColumnName = "country_code"), @PrimaryKeyJoinColumn(name = "state_code", referencedColumnName = "state_code"), @PrimaryKeyJoinColumn(name = "city_name", referencedColumnName = "name")
})
private City city;from Hibernate throws AnnotationException on column used by multiple overlapping foreign keys