Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

hibernate - how to JoinColumn an EmbeddedId

Writer 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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy