У меня есть две таблицы с внешними ключевыми ссылками:
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
(например, последняя строка с COMM_ID = 1 в таблице LOCATION), отсутствуют.
В противном случае (если только один из FROM
или TO
) строка возвращается...
почему?
Comm
объекты:
@ElementCollection
@CollectionTable(name="LOCATION",[email protected](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
Я проверил его в своей БД и вернул правильный результат.