Pourquoi ai-je cette exception?
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;
}
}
Mise à jour: j'ai changé mon code pour qu'il ressemble à ceci:
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;
}
}
mais maintenant je reçois cette exception:
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
Réponses:
Il vous manque un champ annoté avec
@Id
. Chacun a@Entity
besoin d'un@Id
- c'est la clé primaire de la base de données.Si vous ne souhaitez pas que votre entité soit conservée dans une table distincte, mais plutôt faire partie d'autres entités, vous pouvez utiliser à la
@Embeddable
place de@Entity
.Si vous voulez simplement qu'un objet de transfert de données contienne certaines données de l'entité d'hibernation, n'utilisez aucune annotation dessus - laissez-le un simple pojo.
Mise à jour: En ce qui concerne les vues SQL, les documents Hibernate écrivent:
la source
Pour moi,
javax.persistence.Id
devrait être utilisé à la place deorg.springframework.data.annotation.Id
. Pour tous ceux qui ont rencontré ce problème, vous pouvez vérifier si vous avez importé la bonneId
classe.la source
Cette erreur peut être levée lorsque vous importez une bibliothèque différente pour @Id que Javax.persistance.Id ; Vous devrez peut-être aussi faire attention à ce cas
Dans mon cas, j'avais
quand je change le code comme ça, ça marche
la source
Le code ci-dessous peut résoudre l'exception NullPointerException.
Si vous ajoutez
@Id
, vous pouvez en déclarer plus comme la méthode déclarée ci-dessus.la source
Je sais que ça semble fou, mais j'ai reçu une telle erreur parce que j'oublie de supprimer
généré automatiquement par l'outil Eclipse JPA lors de la transformation d'une table en entités que j'ai effectuée.
Suppression de la ligne ci-dessus qui a résolu le problème
la source
L'utilisation de @EmbeddableId pour l'entité PK a résolu mon problème.
la source
Je pense que ce problème après une mauvaise importation de classe de modèle.
Normalement, ce devrait être:
la source
TL; DR
Il vous manque la
@Id
propriété d'entité, et c'est pourquoi Hibernate lève cette exception.Identifiants d'entité
Toute entité JPA doit avoir une propriété d'identifiant, marquée par l'
Id
annotation.Il existe deux types d'identifiants:
Identifiants attribués
Un identifiant attribué se présente comme suit:
L'identifiant attribué doit être défini manuellement par l'application avant d'appeler persist:
Identifiants générés automatiquement
Un identifiant généré automatiquement nécessite l'
@GeneratedValue
annotation en plus de@Id
:Comme je l'ai expliqué dans cet article , Hibernate peut utiliser 3 stratégies pour générer automatiquement l'identifiant d'entité:
IDENTITY
SEQUENCE
TABLE
La
IDENTITY
stratégie est à éviter si la base de données sous-jacente prend en charge des séquences (par exemple, Oracle, PostgreSQL, MariaDB depuis 10.3 , SQL Server depuis 2012). La seule base de données majeure qui ne prend pas en charge les séquences est MySQL.La
SEQUENCE
stratégie est le meilleur choix, sauf si vous utilisez MySQL. Pour leSEQUENCE
stratégie, vous souhaitez également utiliser l'pooled
optimiseur pour réduire le nombre d'aller-retour de base de données lors de la persistance de plusieurs entités dans le même contexte de persistance.Le
TABLE
générateur est un choix terrible car il n'est pas à l'échelle . Pour la portabilité, il vaut mieux utiliserSEQUENCE
par défaut et passer àIDENTITY
pour MySQL uniquement, comme expliqué dans cet article .la source
@GeneratedValue
, non?Cette erreur a été provoquée par l'importation de la mauvaise classe d'ID. Après avoir modifié org.springframework.data.annotation.Id en javax.persistence.Id, l'exécution de l'application
la source