@ManyToOne 与 hibernate 中具有 @EmbeddedId 的类的关系

问题描述 投票:0回答:1

我正在尝试将旧的 XML(从 Hibernate 3.x)迁移到注释(Hibernate 5.x JPA 2.1)。

ClassA: id (pk) VAR_1 VAR_2 ...
ClassB: FIRST_ID (pk) (fk) SECOND_ID (pk) ...

JPA(休眠):

@Entity
@Table("CLASS_A")
public ClassA {
    @Column(name = "id")
    private String id;
    
    /* old working XML
    <many-to-one name="var1" class="ClassB" lazy="false"
            fetch="join">
            <formula>'var_Formula1'</formula>
            <column name="VAR_1" />
    </many-to-one> */

    @ManyToOne( fetch = FetchType.EAGER )
    @Fetch( FetchMode.JOIN )
    @Formula( value = "'var_Formula1'" )
    @MapsId( "id1" )
    private ClassB var1;


    /* old working XML
    <many-to-one name="var2" class="ClassB" lazy="false"
            fetch="join">
            <formula>'var_Formula2'</formula>
            <column name="VAR_2" />
    </many-to-one> */
        
    @ManyToOne( fetch = FetchType.EAGER )
    @Fetch( FetchMode.JOIN )
    @Formula( value = "'var_Formula2'" )
    @MapsId( "id1" )
    private ClassB var2;
}

@Entity
@Table("CLASS_B")
public ClassB {

    @EmbeddedId
    private ClassC classCPK;

    // other variables/columns
}

@Embeddable
public ClassC implements Serializable {
    @Column(name = "FIRST_ID")
    private String id1;

    @Column(name = "SECOND_ID")
    private String id2;
}

但是我明白了

错误:- 导致:java.sql.SQLSyntaxErrorException:ORA-00904: “CLASSA5_”。“VAR_1_FIRST_ID”:无效标识符

我尝试在@MapsId中使用字段名称、属性名称。 我尝试将 @JoinColumns 与可嵌入类中提到的两个 id 一起使用。 我尝试使用 @MapKey 而不是 @MapsId。

我的错误是什么?

我希望在生成的 hbm2ddl 中具有类似以下内容:

left outer join
    ORACLE.ClassB pojodefl9_ 
        on 'var_Formula1'=pojodefl9_.FIRST_ID 
        and pojosclass1_.var1=pojodefl9_.SECOND_ID

left outer join
    ORACLE.ClassB pojodefl10_ 
        on 'var_Formula2'=pojodefl10_.FIRST_ID
        and pojosclass1_.var2=pojodefl10_.SECOND_ID 
jpa hibernate-mapping many-to-one composite-primary-key hibernate-annotations
1个回答
0
投票

对于那些正在努力解决类似问题的人,我找到了正确的迁移注释替换..

    @ManyToOne( fetch = FetchType.EAGER )
    @Fetch( FetchMode.JOIN )
    @JoinColumnOrFormula( column = @JoinColumn( name = "var_1", referencedColumnName = "SECOND_ID" ) )
    @JoinColumnOrFormula( formula = @JoinFormula( value = "'var_Formula1'", referencedColumnName = "FIRST_ID " ) )
    private ClassB var1;"

致以诚挚的问候

© www.soinside.com 2019 - 2024. All rights reserved.