我有一个表,其中父对象具有可选的多对一关系。问题在于该表已设置为默认将fkey列设置为0。
选择时,使用fetch =“ join”等-fkey的默认值0被用来反复尝试从另一个表中选择ID0。当然这不存在,但是我怎么能告诉Hibernate将0的值与NULL相同- 在获取不存在的关系时不循环20多次以上?
<many-to-one name="device" lazy="false" class="Device" not-null="true" access="field" cascade="none" not-found="ignore"> <column name="DEVICEID" default="0" not-null="false"/>
我能够通过创建一个id- long类型来解决此问题,该类型扩展了内置的Long类型,但是如果从SQL返回的id为0,则返回null。这样,在进入hibernate状态以停止进行懒惰提取时,DB中保留了默认的0。
public class IdentifierLongType extends LongType implements IdentifierType { @Override public Object get(ResultSet rs, String name) throws SQLException { long i = rs.getLong(name); if (i == 0) { return null; } else { return Long.valueOf(i); } }
}
强制使用显式默认0的原因是Oracle奇怪地处理了索引和空值,这表明显式值与“ where col is [not] null”相比具有更好的查询性能。