在hibernate查询中缺少具有空值的行

时间:2015-06-22 15:53:36

标签: java hibernate

我有两个带有外键引用的表:

Comm TABLE:

+----+------------+
| ID |    NAME    |
+----+------------+
|  1 | comm name1 |
|  2 | comm name2 |
|  3 | comm name3 |
+----+------------+

LOCATION TABLE: - COMM_ID FK to  Comm --> id

+---------+------+-----+
| COMM_ID | FORM | TO  |
+---------+------+-----+
|       1 | 720  | 721 |
|       1 | 725  |     |
|       1 |      | 766 |
|       1 |      |     |
|       2 | 766  | 225 |
|       3 | 766  | 222 |
+---------+------+-----+

问题是Hibernate返回我的comm对象 在location中遗失SET<location> 没有FROM TO的所有行(如表LOCATION中COMM_ID = 1的最后一行)都缺失。

否则(如果只有FROMTO中的一个)返回该行... 为什么呢?

Comm个对象:

@ElementCollection
@CollectionTable(name="LOCATION",joinColumns=@JoinColumn(name="COMM_ID"))
 public Set<LOCATION> getLocations(){
    return locations;
 }
 public void setLocations(Set<LOCATION> locations){
    this.locations=locations;
 }

Location上课:

@Embeddable
class Location implements java.io.Serializable {

    private BigDecimal fromLocationId;
    private BigDecimal toLocationId;

    public Location() {
    }

    public Location(BigDecimal fromLocationId, BigDecimal toLocationId) {
        this.fromLocationId = fromLocationId;
        this.toLocationId = toLocationId;
    }

    @Column(name="FROM", nullable=true, precision=22, scale=0)
    public BigDecimal getFromLocationId() {
        return this.fromLocationId;
    }

    public void setFromLocationId(BigDecimal fromLocationId) {
        this.fromLocationId = fromLocationId;
    }

    @Column(name="TO", nullable=true, precision=22, scale=0)
    public BigDecimal getToLocationId() {
        return this.toLocationId;
    }

    public void setToLocationId(BigDecimal toLocationId) {
        this.toLocationId = toLocationId;
    }

    @Override
    public int hashCode() {
        return com.google.common.base.Objects.hashCode(fromLocationId, toLocationId);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        final LOCATION  other = (LOCATION) obj;
        return com.google.common.base.Objects.equal(this.fromLocationId, other.fromLocationId) && com.google.common.base.Objects.equal(this.toLocationId, other.toLocationId);
    }
}

我正在使用Hibernate - 4.3.6

LOG:

org.hibernate.SQL - 
    select
        locations0_.COMM_ID as COMM_ID1_2_0_,
        locations0_.FROM as FROM2_8_0_,
        locations0_.TO as TO4_8_0_
    from
        LOCATION  locations0_ 
    where
        locations0_.COMM_ID=1

我在我的数据库中检查了它,它返回了正确的结果。

2 个答案:

答案 0 :(得分:2)

实际上,输出没有任何问题。我想你只是在embeddableentity之间感到困惑。因为,据我所知。如果有很多使用相同字段的实体,则只使用embeddable类来更容易地开发实体。

从我看到的情况来看,hashcodeequals方法会将所有这6条记录视为不同的记录。所以,我认为你想要的是将Location类变成这样的东西。

@Entity
class Location implements java.io.Serializable {

private Long commId;
private BigDecimal fromLocationId;
private BigDecimal toLocationId;

// all the setter getter here

@Override
public int hashCode() {
    return com.google.common.base.Objects.hashCode(commId);
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null || getClass() != obj.getClass()) {
        return false;
    }
    final LOCATION  other = (LOCATION) obj;
    return com.google.common.base.Objects.equal(this.commId, other.commId);
}
}

或者,您当然可以让get方法返回List,然后在行缺少fromto时删除一行。

答案 1 :(得分:2)

可嵌入对象的数据包含在其父表的多个列中。由于没有单个字段值,因此无法知道父对embeddable的引用是否为null。可以假设,如果embeddable的每个字段值都为null,那么引用应为null,但是无法用所有空值表示嵌入。 JPA不允许嵌入式为空,但是一些JPA提供者可能会支持这种做法。

Hibernate:加载实体时,如果embeddable中的所有列都为null,则嵌入引用设置为null。

了解更多信息click here

所以当你保存可以为空的可嵌入值时,hibernate允许保存但是在获取hibernate时会丢弃那些可以为空的行。