ich einige Probleme habe eine @ManyToOne Vereinigung machen lazilly geladen werden. Ich verwende das Fetch = LAZY, aber es funktioniert nicht, wenn Join nicht von der Primärschlüsselspalte gemacht wird.@ManyToOne (Fetch = FetchType.LAZY) funktioniert nicht auf Nicht-Primärschlüssel referenzierte Spalte
Ich weiß, diese Frage war bereits asked, aber ich denke, es wurde nicht richtig beantwortet, so dass ich detaillierte Informationen zur Verfügung stellen, um das Problem zu klären.
Das ist mein Modell:
DummyB -> DummyA
Dies sind die Tabellen:
create table dummyA (
id number(18,0), --pk
name varchar2(20) -- unique field
);
create table dummyB (
id number(18,0),
dummya_id number(18,0),
dummya_name varchar2(20)
);
Und das sind die Einheiten sind:
@Entity
public class DummyA implements Serializable {
private Long id;
private String name;
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class DummyB implements Serializable {
private Long id;
private DummyA dummyA;
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
/* Case 1: mapping DummyB -> DummyA by DummyA NON primary key (field name) */
// @ManyToOne(fetch = FetchType.LAZY)
// @JoinColumn(name = "dummya_id")
// public DummyA getDummyA() {
// return dummyA;
// }
/* Case 2: mapping DummyB -> DummyA by DummyA primary key */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dummya_name", referencedColumnName = "name")
@LazyToOne(LazyToOneOption.PROXY)
public DummyA getDummyA() {
return dummyA;
}
public void setDummyA(DummyA dummyA) {
this.dummyA = dummyA;
}
}
Hinweis getDummyA Methode in Einheit DummyB, ist zu duplizieren Probieren Sie zwei Fälle aus, um den Entitäten beizutreten.
Fall 1: Mapping DummyB -> DummyA von DummyA Primärschlüssel
@ManyToOne (Fetch = FetchType.LAZY) @JoinColumn (name = "dummya_id")
Dies funktioniert gut, nur Eine Abfrage wird ausgeführt, um DummyB-Objekte abzurufen.
Fall 2: Mapping DummyB -> DummyA durch DummyA NON Primärschlüssel (Feldname)
@ManyToOne (fetch = FetchType.LAZY) @JoinColumn (name = "dummya_name", referencedColumnName = "name ")
Gleiches dummyB select ist ausführen, aber direkt danach wird ein dummyA select ausgeführt filter by name =? um das verwandte A-Objekt abzurufen.
Ich bin ein wirklich einfaches jUnit mit Filterung auszuführen:
public class DummyTest {
@Autowired
HibernateTransactionManager transactionManager;
@Test
@Transactional
public void testFindDummyB() throws DAOException {
Long idDummyB = 2L;
Session session = getCurrentHibernateSession();
List lst = session.createCriteria(DummyB.class)
.add(Restrictions.eq("id", idDummyB)).list();
assertTrue(lst.size() > 0);
}
private Session getCurrentHibernateSession() {
return this.transactionManager.getSessionFactory().getCurrentSession();
}
}
Meine Bibliotheken:
- org.hibernate: Hibernate-Kern: jar: 4.2.17.Final: kompilieren
- org.hibernate.common: hibernate-commons-Anmerkungen: jar: 4.0.2.Final:
- org.hibernate.javax.persistence kompilieren: hibernate-JPA-2.0-api: jar: 1.0.1.Final: kompilieren
- org.hibernate: Hibernate-Validator: jar: 4.3.2.Final: bereitgestellt
Andere Dinge, die ich schon versucht habe:
hiberante des @LazyToOne zu getDummyA() -Methode Hinzufügen Doesn Habe keine Wirkung.
@LazyToOne (LazyToOneOption.PROXY) @ManyToOne (fetch = FetchType.LAZY, optional = true) @JoinColumn (name = "dummya_name", referencedColumnName = "name") @LazyToOne (LazyToOneOption.PROXY)
Das Erstellen eines Fremdschlüssels von der DummyB-Tabelle zu dummyA (und einer eindeutigen Integritätsbedingung im Feld dummya.name) hat keine Auswirkung.
- Hinzufügen @Column (unique = true) auf DummyA getName() -Methode hat es nicht geschafft.
- Set optional = true oder false wie vorgeschlagen here hat auch keine Wirkung.
Der Versuch, die träges Laden zu zwingen, die setFetchMode in den Kriterien funktionierten nicht, DummyA wählen hält Ausführung.
Liste lst = session.createCriteria (DummyB.class) .add (Restrictions.eq ("id", idDummyB)). setFetchMode ("dummyA", FetchMode.SELECT) .list();
Ich kann nicht einen Punkt in Hibernate docs finden, wo es zu diesem Verhalten bezieht, so frage ich mich, ob es etwas falsch in meinen Anmerkungen oder stieß ich auf einem Hibernate Fehler.
Kann jemand erzählen?
AKTUALISIERT von md-dev Anfrage: So stellen es klar:
Ist dies das erwartete Verhalten oder ist ein Fehler? Wenn dies das erwartete Verhalten ist, wo ist es dokumentiert?
Vielen Dank.
Der Fall oben ausgesetzt hinzuzufügen, ist eine Vereinfachung meiner Problem, in meinem Fall ist die Spalte, zu der ich komme, eine eindeutige Spalte. Wenn es einen Sinn ergibt, ist es kompliziert zu erklären und es ist nicht der Punkt meiner Frage, ich frage "Ist das das erwartete Verhalten? Wenn ja, wo ist es dokumentiert?" – kothvandir
Dann bitte korrigieren Sie Ihre Frage, denn die obige ist falsch. –
Das ist genau das, was ich in meinem letzten Absatz verlangt habe, aber als du darum gebeten hast, habe ich es deutlicher gemacht. – kothvandir