yin03 yin03 - 3 months ago 28x
Java Question

hibernate - how to JoinColumn an EmbeddedId

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_id
- library_id
- title
- shelf_id
- shelf_id
- library_id
- book_id
- description

I have these models:

public class Book {

private BookKey bookKey;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SHELF_ID", referencedColumnName = "SHELF_ID"),
@JoinColumn(name = "LIBRARY_ID", referencedColumnName = "LIBRARY_ID")
private ObjectA objectA;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ANOTHER_ID", referencedColumnName = "ANOTHER_ID"),
@JoinColumn(name = "LIBRARY_ID", referencedColumnName = "LIBRARY_ID")
private ObjectB objectB;

private String title;


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?



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)