2014-10-29 89 views
2

情況:我有一個masterDB和一個library1DB和library2DB。hibernate - 如何JoinColumn一個EmbeddedId

library1DB和library2DB是兩個獨立的數據庫,但具有相同的模式,因爲每個庫都必須有自己的數據庫。現在我們有一個masterDB,它是所有庫(library1DB和library2DB)中所有數據的聚合版本,仍然記下它們各自的ID並將它們映射到它們的庫ID。

這是我希望我的表被結構化: 書 - book_id - library_id - 標題 - shelf_id 貨架 - shelf_id - library_id - book_id - 描述

我有這些模型:

@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; 
} 

但我得到這個例外:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Book column: library_id (should be mapped with insert="false" update="false") 

我一直在使用@IdClass代替@Embeddable和@EmbeddedId嘗試過了,我得到這個:

Caused by: org.hibernate.DuplicateMappingException: Table [book] contains physical column name [libraryId] represented by different logical column names: [libraryId], [LIBRARY_ID] 

任何幫助嗎?

謝謝!

回答

4

您應該爲第二個映射列library_id添加insert="false", update="false"。 試試這個:

@JoinColumn(name = "LIBRARY_ID", referencedColumnName = "LIBRARY_ID", 
      insertable = false, updatable = false) 
+0

它工作的時候我只有對象A,它的工作原理。但是當我有ObjectB時,我又遇到了同樣的異常。 – lorraine 2014-10-29 10:26:37

+1

您已經將「library_id」列映射到對象「BookKey」中。因此,您應該爲映射同一列的所有其他位置添加「insertable = false,updatable = false」。 – Alex 2014-10-29 12:47:20

5

我遇到了同樣的問題。如果將insert =「false」,update =「false」僅添加到一個,則會得到一個異常,指出您混合了可寫和不可寫,並且這是不允許的。以下作品:

我解決它使用@PrimaryKeyJoinColumns,試試這個(從另一個例子):

@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; 

Hibernate throws AnnotationException on column used by multiple overlapping foreign keys

相關問題