一尘不染

休眠多对一外键默认0

hibernate

我有一个表,其中父对象具有可选的多对一关系。问题在于该表已设置为默认将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"/>

阅读 237

收藏
2020-06-20

共1个答案

一尘不染

我能够通过创建一个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”相比具有更好的查询性能。

2020-06-20