Warum bekomme ich diese Ausnahme?
package com.domain.idea;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.AccessType;
/**
* object model for the view [InvestmentReturn].[vMAE_MFE]
*/
@Entity
@Table(name="vMAE_MFE", schema="InvestmentReturn")
@AccessType("field")
public class MAE_MFEView
{
/**
* trade property is a SuggestdTradeRecommendation object
*/
@OneToOne(fetch = FetchType.LAZY , cascade = { CascadeType.PERSIST })
@JoinColumn(name = "suggestedTradeRecommendationID")
private SuggestedTradeRecommendation trade;
/**
* Most Adeverse Excursion value
*/
private int MAE;
public int getMAE()
{
return MAE;
}
/**
* Most Favorable Excursion value
*/
private int MFE;
public int getMFE()
{
return MFE;
}
/**
* @return trade property
* see #trade
*/
public SuggestedTradeRecommendation getTrade()
{
return trade;
}
}
Update: Ich habe meinen Code so geändert, dass er so aussieht:
package com.domain.idea;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.AccessType;
/**
* object model for the view [InvestmentReturn].[vMAE_MFE]
*/
@Entity
@Table(name="vMAE_MFE", schema="InvestmentReturn")
@AccessType("field")
public class MAE_MFEView
{
/**
* trade property is a SuggestdTradeRecommendation object
*/
@Id
@OneToOne(fetch = FetchType.LAZY , cascade = { CascadeType.PERSIST })
@JoinColumn(name = "suggestedTradeRecommendationID")
private SuggestedTradeRecommendation trade;
/**
* Most Adeverse Excursion value
*/
private int MAE;
public int getMAE()
{
return MAE;
}
/**
* Most Favorable Excursion value
*/
private int MFE;
public int getMFE()
{
return MFE;
}
/**
* @return trade property
* see #trade
*/
public SuggestedTradeRecommendation getTrade()
{
return trade;
}
}
aber jetzt bekomme ich diese Ausnahme:
Caused by: org.hibernate.MappingException: Could not determine type for: com.domain.idea.SuggestedTradeRecommendation, at table: vMAE_MFE, for columns: [org.hibernate.mapping.Column(trade)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:276)
at org.hibernate.mapping.RootClass.validate(RootClass.java:216)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1135)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
... 145 more
Antworten:
Ihnen fehlt ein mit Anmerkungen versehenes Feld
@Id
. Jeder@Entity
benötigt einen@Id
- dies ist der Primärschlüssel in der Datenbank.Wenn Sie nicht möchten, dass Ihre Entität in einer separaten Tabelle gespeichert wird, sondern Teil anderer Entitäten ist, können Sie
@Embeddable
stattdessen verwenden@Entity
.Wenn Sie einfach möchten, dass ein Datenübertragungsobjekt einige Daten aus der Entität im Ruhezustand enthält, verwenden Sie keinerlei Anmerkungen dazu - lassen Sie es ein einfaches Pojo.
Update: In Bezug auf SQL-Ansichten schreiben Hibernate-Dokumente:
quelle
Für mich
javax.persistence.Id
sollte statt verwendet werdenorg.springframework.data.annotation.Id
. Für alle, die auf dieses Problem gestoßen sind, können Sie überprüfen, ob Sie die richtigeId
Klasse importiert haben .quelle
Dieser Fehler kann ausgelöst werden, wenn Sie eine andere Bibliothek für @Id als Javax.persistance.Id importieren . Möglicherweise müssen Sie auch in diesem Fall aufpassen
In meinem Fall hatte ich
Wenn ich den Code so ändere, hat es funktioniert
quelle
Der folgende Code kann die NullPointerException lösen.
Wenn Sie hinzufügen
@Id
, können Sie eine ähnliche Methode wie oben deklarieren.quelle
Ich weiß, klingt verrückt, aber ich habe einen solchen Fehler erhalten, weil ich vergessen habe, ihn zu entfernen
Wird vom Eclipse JPA-Tool automatisch generiert, wenn ich eine Transformation von Tabelle zu Entitäten durchgeführt habe.
Durch Entfernen der obigen Zeile wurde das Problem behoben
quelle
Die Verwendung von @EmbeddableId für die PK-Entität hat mein Problem gelöst.
quelle
Ich denke, dieses Problem nach Modellklasse falscher Import.
Normalerweise sollte es sein:
quelle
TL; DR
Ihnen fehlt die
@Id
Entitätseigenschaft, und aus diesem Grund löst Hibernate diese Ausnahme aus.Entitätskennungen
Jede JPA-Entität muss über eine Bezeichner-Eigenschaft verfügen, die mit der
Id
Anmerkung gekennzeichnet ist.Es gibt zwei Arten von Bezeichnern:
Zugewiesene Bezeichner
Eine zugewiesene Kennung sieht wie folgt aus:
Die zugewiesene Kennung muss von der Anwendung manuell festgelegt werden, bevor der Aufruf persist:
Automatisch generierte Bezeichner
Eine automatisch generierte Kennung erfordert die
@GeneratedValue
Anmerkung neben@Id
:Wie ich in diesem Artikel erklärt habe , gibt es drei Strategien, mit denen Hibernate die Entitätskennung automatisch generieren kann:
IDENTITY
SEQUENCE
TABLE
Die
IDENTITY
Strategie ist zu vermeiden, wenn die zugrunde liegende Datenbank Sequenzen unterstützt (z. B. Oracle, PostgreSQL, MariaDB seit 10.3 , SQL Server seit 2012). Die einzige wichtige Datenbank, die keine Sequenzen unterstützt, ist MySQL.Die
SEQUENCE
Strategie ist die beste Wahl, es sei denn, Sie verwenden MySQL. Für dieSEQUENCE
Strategie möchten Sie auch denpooled
Optimierer verwenden , um die Anzahl der Datenbank-Roundtrips zu verringern, wenn mehrere Entitäten im selben Persistenzkontext beibehalten werden.Der
TABLE
Generator ist eine schreckliche Wahl, weil er nicht skaliert . Aus Gründen der Portabilität sollten SieSEQUENCE
standardmäßig besser verwenden undIDENTITY
nur für MySQL wechseln , wie in diesem Artikel erläutert .quelle
@GeneratedValue
, oder?Dieser Fehler wurde durch den Import der falschen ID-Klasse verursacht. Nach dem Ändern von org.springframework.data.annotation.Id in javax.persistence.Id wird die Anwendung ausgeführt
quelle