2011-06-10 31 views
0

我有两个相关的实体被映射到由hibernate支持的JPA注释。这些实体在oracle中都有序列支持的标识列。我们还有每月分区,由名为ENTRY_DATE的列表示。加入相关实体时可以指定基于日期的分区键吗?

T_MASTER  T_JOINED 
--------- ----------- 
MASTER_ID JOINED_ID 
ENTRY_DATE ENTRY_DATE 
      MASTER_ID(FK) 
...   .... 

为了获得分区键的好处,我想Hibernate来参加双方的身份ID和分区键,但是当我使用下面的注释中加入类:

@ManyToOne 
@JoinColumns(value={ 
    @JoinColumn(name="MASTER_ID"), 
    @JoinColumn(name="ENTRY_DATE")}) 
private Master master; 

我收到有关连接列过多的错误。我被迫使用

@JoinColumn(name="MASTER_ID") 
private Master master; 

我是一个JPA /休眠noob。 加入相关实体时是否可以使用除主键以外的分区键?

谢谢!

+0

更新:亚历克斯的方法工作,但我在测试模式下生成序列的麻烦。最终代码如下所示: – darthtrevino 2011-06-23 08:20:17

回答

1

您可能需要在Master中声明两个列作为组合主键的一部分。 Hibernate不会太关心数据库中真正的PK。映射将与@Embeddable稍微更复杂,但它应该解决问题。

+0

甜蜜!我尝试在主类中使用多个@Id注释,但将这两个属性分解为单独的嵌入类。谢谢Alex! – darthtrevino 2011-06-10 13:43:18

0

是的。

使用本地的SQL看起来如下:

Query query = session.createSQLQuery("SELECT {T_master.*}, {T_joined.*} FROM schema.t_master AS T_master OUTER LEFT JOIN schema.T_joined AS T_joined ON T_master.ENTRY_DATE = T_joined.ENTRY_DATE AND T_master.MASTER_ID = T_joined.JOINED ID " /*WHERE ... */); 
query.setEntity("T_master", T_master.class); 
query.setJoin("T_joined", "T_master.joinedSet"); //joinedSet is the one-to-many mapping 
query.setJoin("T_master", "T_joined.master"); 

因此,你要对你的查询非常详细,而且冬眠只充当一个对象映射器。

使用标准或HQL,不可能有外键左加入主键以外的某个字段。这就是为什么如果你有这样的选择,使用原生的SQL代码。

相关问题