用户类型加入休眠

Posted

技术标签:

【中文标题】用户类型加入休眠【英文标题】:UserType join in Hibernate 【发布时间】:2008-10-08 14:51:04 【问题描述】:

在这种情况下,是否有可能让 hibernate 为某些“正确”值做“正确的事情”?

from ClassA a, ClassB b
where a.prop = b.prop

问题是 prop 是一个在连接表中具有不同表示的 UserType。在表 A 中,它表示为整数,在表 B 中,它表示为 char。所以 eq 测试转换看 1 == 'a' 或多或少,这是错误的,但由 1 或 'a' 表示的对象应该是相同的,因此它们应该比较为真。

【问题讨论】:

【参考方案1】:

我认为您可以在映射文件中的关系上使用 <formula> 标记。

例如:

<many-to-one name="myClassB" class="ClassB">
  <formula>--Some SQL Expression that converts between ClassA.prop and ClassB.prop</formula>
</many-to-one>

我用它来关联两个表,其中一个表使用整数,但将它与另一个表中的 char 字段相关联。这可能不是您想要的,但也许它会让您走上正确的道路。

【讨论】:

【参考方案2】:

使用 SQL 表达式进行连接。这样您就可以在查询本身中显式地进行类型转换。

【讨论】:

【参考方案3】:

(1) 将映射到“prop”的列的数据类型更改为相同。这将需要“让 DBA 成为你的朋友”,但会导致一致的“prop” UserType 使用。

(2)处理equals()方法中的类型差异

public boolean equals(Object x, Object y) throws HibernateException 
    boolean retValue = false;
    if (x == y) retValue = true;

    if (x!=null && y!=null)
        Character xChar = new Character(x);
        Character yChar = new Character(y);
        if (xChar.equals(ychar))
            retValue = true;
        
    

    return retValue;

【讨论】:

1 不是一个选项,因为它是使用相同数据库的旧系统的问题。 2.不会被翻译成sql。

以上是关于用户类型加入休眠的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.verifyError 在休眠特定用户类型上

通过休眠加入外键

休眠用户消息关系

休眠:加入带有额外列的表,从一侧删除子项

插入一张多对多表并加入表休眠

休眠条件:在没有映射关联的情况下加入表