hibernate - 如何JoinColumn一个EmbeddedId

lor*_*tol 4 java hibernate

情况:我有一个masterDB和一个library1DB和library2DB.

library1DB和library2DB是两个独立的数据库,但具有相同的模式,因为每个库必须有自己的数据库.现在我们有了一个masterDB,这是所有库(library1DB和library2DB)中所有数据的聚合版本,仍然记录它们各自的id并将它们映射到它们的库id.

这是我希望我的表格结构化:book - book_id - library_id - title - shelf_id shelf - shelf_id - library_id - book_id - description

我有这些模型:

@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;
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个例外:

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

我尝试使用@IdClass而不是@Embeddable和@EmbeddedId,我得到了这个:

Caused by: org.hibernate.DuplicateMappingException:  Table [book] contains physical column name [libraryId] represented by different logical column names: [libraryId], [LIBRARY_ID]
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

谢谢!

Ale*_*lex 9

您应该insert="false", update="false"为第二个映射列添加library_id.试试这个:

@JoinColumn(name = "LIBRARY_ID", referencedColumnName = "LIBRARY_ID",
            insertable = false, updatable = false)
Run Code Online (Sandbox Code Playgroud)

  • 您已经在对象`BookKey`中映射了列`library_id`.因此,您应该为映射同一列的所有其他位置添加`insertable = false,updatable = false`. (2认同)

Ben*_*Ben 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;
Run Code Online (Sandbox Code Playgroud)

来自Hibernate会在多个重叠外键使用的列上抛出AnnotationException