是否可以在实体中映射字段而不定义任何关联?

时间:2010-12-23 11:17:42

标签: java hibernate mapping

我在DB(简化)中有以下架构

MainTable(
    ID primary key
    SOMEFIELD
    CODE_FK1 -- references OtherTable1 CODE (without declared foreign key)
    CODE_FK2 -- references OtherTable2 CODE (without declared foreign key)
    ... Other fields used
)

OtherTable1(
    CODE primary key
    LABEL
    ... other fields not used
)

OtherTable2(
    CODE primary key
    LABEL
    ... other fields not used
)

我问是否有办法为主表定义我的实体,以便直接使用其他表中的标签,即不为这些其他表定义实体。

我无法更改数据库架构,这非常糟糕(在多个表中定义了标签/代码耦合,在多个表中定义)。 如果有可能,这个解决方案将允许我的代码简单,因为我真的不需要这些其他实体。

我想这会产生类似的结果:

@Entity
public class MainEntity{
    @Id
    private Integer ID;

    @Column(name="SOMEFIELD")
    private String SomeField;

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1")
    private String Label1;

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1")
    private String Label1;

}

先谢谢你的帮助!

2 个答案:

答案 0 :(得分:12)

另一种可能性是使用@Formula注释从另一个表中获取值。每当您加载实体时,这将自动生成子选择。

我认为你需要这样的东西:

    @Entity
public class MainEntity{
    @Id
    private Integer ID;

    @Column(name="SOMEFIELD")
    private String SomeField;

    @Formula("(SELECT ot1.LABEL FROM OtherTable1 ot1 WHERE ot1.CODE = CODE_FK_1)")
    private String Label1;

}

在[Hibernate docs] [1]中几乎没有关于此的信息,因此您可能需要一些试验和错误才能使其正确(但您应该能够使用hibernate.show_sql=true进行解决。

这种方法有两个可能的缺点:

  1. 这是特定于hibernate的代码
  2. 这是纯SQL,因此可能是特定于数据库的
  3. HTH

    [1]:http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-property hibernate docs

答案 1 :(得分:2)