¿Por qué recibo esta excepción?
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;
}
}
Actualización: he cambiado mi código para que se vea así:
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;
}
}
pero ahora recibo esta excepción:
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
Respuestas:
Te falta un campo anotado con
@Id
. Cada uno@Entity
necesita un@Id
: esta es la clave principal en la base de datos.Si no desea que su entidad sea persistente en una tabla separada, sino que sea parte de otras entidades, puede usarla en
@Embeddable
lugar de@Entity
.Si desea simplemente que un objeto de transferencia de datos contenga algunos datos de la entidad de hibernación, no use anotaciones en absoluto, déjelo como un simple pojo.
Actualización: en lo que respecta a las vistas SQL, los documentos de Hibernate escriben:
fuente
Para mí,
javax.persistence.Id
debería usarse en lugar deorg.springframework.data.annotation.Id
. Para cualquiera que haya encontrado este problema, puede verificar si importó laId
clase correcta .fuente
Este error puede ser arrojado al importar una biblioteca diferente para @Id que Javax.persistance.Id ; Es posible que también deba prestar atención a este caso
En mi caso tuve
cuando cambio el código de esta manera, funcionó
fuente
El siguiente código puede resolver la NullPointerException.
Si agrega
@Id
, puede declarar algunos más como el método declarado anteriormente.fuente
Sé que suena loco pero recibí ese error porque olvido eliminar
generado automáticamente por la herramienta Eclipse JPA cuando se realiza una transformación de tabla a entidades.
Eliminando la línea de arriba que resolvió el problema
fuente
El uso de @EmbeddableId para la entidad PK ha resuelto mi problema.
fuente
Creo que este problema después de la clase de modelo de importación incorrecta.
Normalmente, debería ser:
fuente
TL; DR
Te falta la
@Id
propiedad de la entidad, y es por eso que Hibernate está lanzando esa excepción.Identificadores de entidad
Cualquier entidad JPA debe tener una propiedad de identificador, que está marcada con la
Id
anotación.Hay dos tipos de identificadores:
Identificadores asignados
Un identificador asignado tiene el siguiente aspecto:
El identificador asignado debe ser configurado manualmente por la aplicación antes de que la llamada persista:
Identificadores autogenerados
Un identificador autogenerado requiere la
@GeneratedValue
anotación además de@Id
:Como expliqué en este artículo , hay 3 estrategias que Hibernate puede usar para generar automáticamente el identificador de entidad:
IDENTITY
SEQUENCE
TABLE
La
IDENTITY
estrategia debe evitarse si la base de datos subyacente admite secuencias (por ejemplo, Oracle, PostgreSQL, MariaDB desde 10.3 , SQL Server desde 2012). La única base de datos importante que no admite secuencias es MySQL.La
SEQUENCE
estrategia es la mejor opción a menos que esté usando MySQL. Para laSEQUENCE
estrategia, también desea utilizar elpooled
optimizador para reducir el número de viajes de ida y vuelta de la base de datos al persistir varias entidades en el mismo contexto de persistencia.El
TABLE
generador es una elección terrible porque no escala . Para la portabilidad, es mejor usarloSEQUENCE
de forma predeterminada y cambiar aIDENTITY
MySQL solamente, como se explica en este artículo .fuente
@GeneratedValue
, ¿verdad?Este error fue causado al importar la clase de Id incorrecta. Después de cambiar org.springframework.data.annotation.Id a javax.persistence.Id, la aplicación se ejecuta
fuente