有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate具有不同列数的多对一映射

嗨,我有两张桌子如下

表1:


    +-------------------+
    | ID  LOB col1 col2 |
    +-------------------+

主键(ID和LOB)

表2:


    +-----------------+
    | SK ID col3 col4 |
    +-----------------+

主键(SK)

需要给出从表2到表1的多对一关系,因为表1复合主键(ID和LOB),但表2没有任何与LOB相关的列。我无法提供映射。 请帮忙

编辑我尝试了表2的hibernate映射:

<many-to-one name="class1Obj" class="com.acs.enterprise.common.Class1" 
            lazy="proxy" insert="false" update="false">
    <column name="ID" />
    <column name="LOB" />
</many-to-one>

上述方法不起作用。在获取记录时,它尝试从表2中获取LOB代码,而表1中根本不存在LOB代码


共 (3) 个答案

  1. # 1 楼答案

    Hibernate @Id不必与真正的数据库主键对应(当然,尽管它们需要匹配)

    如果IDTable1中的唯一列,则只将Hibernate id映射到它,并将LOB保留为普通字段

    如果ID不是唯一的列,那么多对一无论如何都不能正常工作,因为引用的表中会有多个匹配的行

  2. # 2 楼答案

    假设table2.SK是到table1.ID的FK,并且没有具有相同ID的table1条目,则可以按如下方式编写映射:

    @ManyToOne
    @JoinColumn(name = "ID", insertable = false, updatable = false)
    private Class1 class1Obj;
    

    如果有更多的table1行具有相同的ID,则映射将失败,因为一个子级将与多个父级匹配

    因此,为了获得适当的many-to-one关联,您需要一个FK来连接一个唯一的父列

  3. # 3 楼答案

    @Entity
    @Table(name="Table_name")
    public class table_name {
    @EmbeddedId
    @AttributeOverrides({
    @AttributeOverride(name = "id1", column = @Column(name = "col1")),
    @AttributeOverride(name = "id2", column = @Column(name = "col2")) })