我使用Hibernate访问旧版数据库。对于某些表,不强制执行父子引用完整性,并且对子表中的某些“父”列使用long
0值而不是NULL来表示“无父级”。
我仍然希望在@ManyToOne
和@OneToMany
字段中使用这些关系,但得到EntityNotFound
错误,因为0值与主表中的任何记录都不对应。
我有什么选择?
答案 0 :(得分:8)
使用NotFound
注释:
@NotFound(action = NotFoundAction.IGNORE)
请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-manytoone
答案 1 :(得分:0)
您可以将其映射到java.lang.Long
,其默认值为null。或者,如果@PostLoad
,您可以使用0
并将其归零。您也可以使用@Formula
并忽略0
。
@Formula
中写的join conditions
可用于id_fk is not null or id_fk <> 0
。
由于我不知道提供有效示例的数据模型很棘手。试试:
show_sql
块。
如果它不符合您的需求,您可以自己编写documentation
如果您正在使用某种日志记录,请启用org.hibernate.sql
属性。并将DEBUG
{{1}}添加到您的配置中。
答案 2 :(得分:0)
而不是@JoinColumn可以使用@JoinFormula。喜欢这个
@JoinFormula(value="CASE the0isNullColumn WHEN 0 THEN NULL ELSE the0isNullColumn END")
表达式意味着我们检查列以及它是否返回NULL。然后,hibernate不会搜索相关实体。