我正在使用Spring& amp ;;开发webapp。休眠。
表1:BaseTable
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| Id | bigint(20) | NO | PRI | | auto_increment |
| Serial1 | varchar(255) | YES | | NULL | |
| Serial2 | varchar(255) | YES | | NULL | |
| ModelNum | varchar(255) | YES | | NULL | |
| ... | .... | .. | 0 | | |
+------------+--------------+------+-----+---------+----------------+
表2:DetailTable
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| Id1 | varchar(20) | NO | PRI | | |
| Id2 | varchar(20) | NO | PRI | | |
| Id3 | varchar(20) | NO | PRI | | |
| Serial | varchar(255) | YES | | NULL | |
| ... | .... | .. | 0 | | |
+------------+--------------+------+-----+---------+----------------+
我需要根据连续出版物加入表格。 Serial
中的Table2
可能包含来自Serial1
的{{1}}或Serial2
的值,因此它应该像OR运算符一样进行比较。我正在使用hbm.xml表。没有注释映射。我加入了以下表格:
Table1
我之前使用过此查询:
<one-to-one name="notes"
class="Notes" entity-name="Notes">
</one-to-one>
我浏览了这个http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html,但只使用了一个关键列。
如何在此方案中使用HBM.XML加入?有可能吗?
答案 0 :(得分:1)
解决方案1
在Table1
上创建一个数据库视图,该视图公开了外键引用Table2
。从您发布的查询中投射外键,无论如何都要用于视图。然后将您的实体映射到视图。
解决方案2
使用join formula:
例如,在映射到Table1
的实体中定义与映射到Table2
的实体的多对一关联(似乎是您的用例):
@ManyToOne
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT t2.serial FROM Table2 t2 WHERE serial1 = t2.serial OR serial2 = t2.serial)", referencedColumnName="serial"))
})
private Entity2 entity2;
但是,暂时加入公式似乎在Hibernate中非常脆弱(我设法使这项工作仅用于多对一关联,我必须使Entity2
实现Serializable
;否则它不起作用并抛出一些奇怪的NullPointer-
和ClassCastException
s。。