yin03 yin03 - 4 months ago 61
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
- 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!

Answer

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)
Comments