我在数据库中有以下架构(简化)
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; }
在此先感谢您的帮助!
另一种可能性是使用@Formula注释从另一个表中获取值。每当您加载实体时,这将自动生成一个子选择。
@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。)
hibernate.show_sql=true
这种方法有两个缺点:
高温超导
[1]:http : //docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity- hibspec- propertyhibernate文档