私はのHibernateという別の明らかに不可解な問題に直面しているため、私は再び書きます。すべてうまくいくようですが、単純なクエリを作成しようとするとエラー番号が返されます()。リストは同じ例外を繰り返し繰り返しているようです。)。Hibernate - クエリ中にエラーが発生しました。例外の "ループ"
私は複合主キーを持つSensoreDBと呼ばれるクラスを、持っている(私はこれが休止状態でのみ動作していても、@Id
との二つの部材を注釈付き)と、データベース内のすべての要素を取得する必要があります静的メソッドgetAll()
:
@Entity
@Table(name="abitazioni")
public class AbitazioneDB {
@Id
@GeneratedValue
@Column(name="id")
private Integer id;
@Column(name="indirizzo")
private String indirizzo;
@Column(name="nome_proprietario")
private String nomeProprietario;
@Column(name="tel_proprietario")
private String telProprietario;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name="id_abitazione")
private Set<SensoreDB> sensori = new HashSet<SensoreDB>();
public AbitazioneDB(){
super();
}
}
01:
@Entity
@Table(name = "sensori")
public class SensoreDB implements Serializable{
@Id
@Column(name="id_sensore")
private Integer idSensore;
@Id
@ManyToOne
@JoinColumn(name="id_abitazione")
private AbitazioneDB abitazione;
@Column(name="soglia_allarme")
private Float sogliaAllarme;
@Column(name="tipo_allarme")
private String tipoAllarme;
public SensoreDB(){
super();
}
public static List<SensoreDB> getAll(){
//apro la sessione e la transazione
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
List<SensoreDB> ret = session.createQuery("from SensoreDB").getResultList();
session.close();
return ret;
}
}
は完全を期すために、私は、クラス前のクラスと1対多のアソシエーションを有する(AbitazioneDB)を示します
私は単純にすでにTestHibernate ...
public class TestHibernate {
public static void main(String[] args) {
SensoreDB.getAll();
System.out.println("Ok!");
}
}
を使用したデータベース内にある要素を照会しようとすると...私は例外の数を取得します。このリストは私のコンソールで「繰り返し」表示されているようです:
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1218)
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1101)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:639)
at org.hibernate.type.EntityType.resolve(EntityType.java:431)
at org.hibernate.type.ComponentType.resolve(ComponentType.java:685)
at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.resolveEntityKey(EntityReferenceInitializerImpl.java:142)
at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.resolveEntityKey(AbstractRowReader.java:143)
at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:94)
at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:241)
at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86)
at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4004)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278)
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121)
私が間違っていることを誰かに教えてもらえますか? Eclipseのコンソールが私を示さなかったので、
[UPDATE]
すみません、私は例外を書いていない、今私が見つけた:
Exception in thread "main" java.lang.StackOverflowError
[更新2]
Hereのコンソールの出力が参考になる場合は、
[UPDATE 3]
しようとの時間後、私はこの問題は、タイプをフェッチの使用に多少関係しているという結論に来ています。どうやら、私がSensoreDB
の注釈を@ManyToOne
から@ManyToOne(fetch=FetchType.LAZY)
に変更しても、正しくテストする必要があるにしても、すべて正常に動作します。これはなぜ起こっているのですか?
あなたの例外は何ですか? –
Hibernateは 'SensoreDB'を読み込み、次に' AbitazioneDB'を読み込み、各 'AbitazioneDB'の' SensoreDB's、 'SensoreDB' etc =>無限ループの' AbitazioneDB'を読み込みます。あなたは関係の片側を切り開いて問題を解決することができます。たとえば、 'AbitazioneDB'クラスの' Set 'を削除します。 –
@ArnaudDenoyelleこれは問題ではありません。これは、対応する 'AbitazioneDB'がすでにセッションキャッシュに入っていて、データが合理的に構造化されているならば、Hibernateはループを行うべきではないからです。しかし、別の潜在的な問題があります:Hibernateは、関係を誰が所有しているのか、「AbitazioneDB」または「SensoreDB」を知らないのですか?一番簡単な方法は、データベース構造がそれをサポートしていれば 'mappedBy =" abitazione "'を 'sensori'の' @ OneToMany'に追加することです(もちろん '@ JoinColumn'をそこで削除する必要があります)。 – Thomas