【发布时间】:2015-09-08 04:06:24
【问题描述】:
我有两个带有外键引用的表:
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 返回我的通讯对象
在SET<location> 中缺少location
没有FROM 和 TO 的所有行(例如 LOCATION 表中 COMM_ID = 1 的最后一行)都丢失了。
否则(如果只有FROM 或TO 之一)返回该行...
为什么?
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
日志:
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
我在我的数据库中检查了它,它返回了正确的结果。
【问题讨论】:
-
我错过了什么吗?你的数据显示 from 和 to 是字符串,但你映射说它们应该是数字????
-
请发布整个
LOCATION课程。由于您使用的是Set,因此必须正确覆盖equals和hashCode方法。 -
public boolean equals(com.google.common.base.Object obj)这看起来不对。请发布 full 课程。并检查您是否发布了真实代码。 -
两件事:首先为什么“comm_id”变量丢失了?你不需要吗?如果该表的两行具有不同的“comm_id”,但都没有“from”或“to”,则可能会出现问题,因此它们仍然“逻辑”等于您的程序。第二:我认为
com.google.common.base.Objects.equal(this.fromLocationId, other.fromLocationId)在这里很危险。因为它应该调用BigDecimal#equals,并且这个实现对“相等”实例非常严格。要检查这是否是问题,请测试this implementation 或使用List而不是Set -
我改变了我的“equal”方法并没有帮助,无论如何我在“equal”方法中添加了断点并且没有命中。 (当位置返回时,它会命中这个断点)