2015-01-08 50 views
0

欲了解更多信息,请参阅my other question如何用硬编码值替换@JoinColumn?

我想加入我的Employee实体类到Code实体类,但代码PK是复合(DOMAIN,CODE),因为它列出了许多不同的代码域,但Employee类/表中的代码全部来自一个单一的域,不需要在Employee类/表中有一个域字段(因为它永远都是一样的)。

我可以通过在雇员表和硬编码的值(例如EMP_TYPE),而不是一个冗余列使用CODE字段加入雇员代码

如果我员工类/表确实有多余的专栏中,我会参加这样的:

@JoinColumns({ 
     @JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"), 
     @JoinColumn(name = "DOMAIN", referencedColumnName = "DOMAIN)}) 
    @ManyToOne(optional = false) 
    private Code sharedStatute; 

,但我真的不希望有额外的列在DB和因为它永远都是一样的。

我试图完成将相当于SQL中的以下内容:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type 
FROM Employee e JOIN Code c 
ON e.emp_type_code = c.code 
WHERE c.domain = 'EMP_TYPE' 

,而不是在雇员表中增加一个字段domain和填充每一个纪录相同的值(“EMP_TYPE” )然后执行:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type 
FROM Employee e JOIN Code c 
ON e.emp_type_code = c.code 
AND e.domain = c.domain 

前者效率更高,因为它使我不必拥有冗余字段。所以我试图做的是同样的事情,但在JPA

你们中的一些人可能会说“为什么不为每个代码设置单独的查找表”,但我认为这是一个糟糕的主意,并导致数据库表和相应的应用程序实体混乱。按代码类型(或域)分区单个代码查找表要好得多。

+0

看到这个问题,而不是 https://stackoverflow.com/questions/8924928/hibernate-how-to-use-a-constant-as-part-of-composite-foreign-reference –

回答

3

这应该工作?

@JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE") 
@Where(clause = "domain = 'EMP_TYPE'") 
@ManyToOne(optional = false) 
private Code sharedStatute; 
+0

你在哪里得到' @ Where从哪里注释?似乎不在'javax下。持久性' – amphibient

+0

这是一个休眠功能,我认为它已经成为JPA2,但显然不是。 – Affe

+0

不幸的是没有...在JPA中有不同的方法来完成同样的事情吗? – amphibient

0

有一种方法只用javax.persistence注释来做到这一点:

@JoinColumns({ 
    @JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"), 
    @JoinColumn(name = "CODE_TABLE_NAME.DOMAIN", referencedColumnName = "'EMP_TYPE'")}) 
@ManyToOne(optional = false) 
private Code sharedStatute; 

注意单引号在referencedColumnName,这是你正在寻找的字符串值。

但是,如果在实体中有多个Code对象,DOMAIN上的连接只会在jpa中完成一次,从而导致不好的结果。目前,我通过让这些场地负荷变得迟缓来规避这种情况,但这并不理想。

更多信息here

+1

有人可以解释downvote? –

+0

我可以解释downvote:单引号字符串不存在于Java中。单引号仅用于单个字符。也许你的意思是:'referenceColumnName =''EMP_TYPE'“'? – LordOfThePigs

+0

谢谢,我想我搞砸了,当我让我的工作代码看起来更像是提问者使用的。希望有人告诉我有关错字':-) –