我有两个带有外键引用的表:
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的最后一行)都缺失。
否则(如果只有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
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
我在我的数据库中检查了它,它返回了正确的结果。
答案 0 :(得分:2)
实际上,输出没有任何问题。我想你只是在embeddable
和entity
之间感到困惑。因为,据我所知。如果有很多使用相同字段的实体,则只使用embeddable
类来更容易地开发实体。
从我看到的情况来看,hashcode
和equals
方法会将所有这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
,然后在行缺少from
或to
时删除一行。
答案 1 :(得分:2)
可嵌入对象的数据包含在其父表的多个列中。由于没有单个字段值,因此无法知道父对embeddable的引用是否为null。可以假设,如果embeddable的每个字段值都为null,那么引用应为null,但是无法用所有空值表示嵌入。 JPA不允许嵌入式为空,但是一些JPA提供者可能会支持这种做法。
Hibernate:加载实体时,如果embeddable中的所有列都为null,则嵌入引用设置为null。
了解更多信息click here
所以当你保存可以为空的可嵌入值时,hibernate允许保存但是在获取hibernate时会丢弃那些可以为空的行。