Ho due tabelle con riferimenti di chiave esterna:righe mancanti con valore vuoto nella query 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 |
+---------+------+-----+
Il problema è Hibernate ritorna il mio oggetto comm mancante location
in SET<location>
Tutte le righe in cui non v'è alcun FROM
eTO
(come l'ultima riga con COMM_ID = 1 nella tabella LOCATION) mancano.
In caso contrario (se solo uno di FROM
o TO
) la riga viene restituita ... perché?
Comm
oggetti:
@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
classe:
@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);
}
}
Sto usando 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
Ho controllato nel mio DB e restituisce il risultato corretto.
Mi manca qualcosa? i tuoi dati mostrano da e per essere stringhe, ma la tua mappatura dice che dovrebbero essere numeri ???? –
scusate l'ho aggiustato .. – user986474
Si prega di postare l'intera classe 'LOCATION'. Dato che stai usando 'Set', è obbligatorio sovrascrivere correttamente il metodo' equals' e 'hashCode'. – Tom