¿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@Entitynecesita 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
@Embeddablelugar 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.Iddebería usarse en lugar deorg.springframework.data.annotation.Id. Para cualquiera que haya encontrado este problema, puede verificar si importó laIdclase 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
@Idpropiedad 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
Idanotació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
@GeneratedValueanotació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:
IDENTITYSEQUENCETABLELa
IDENTITYestrategia 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
SEQUENCEestrategia es la mejor opción a menos que esté usando MySQL. Para laSEQUENCEestrategia, también desea utilizar elpooledoptimizador 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
TABLEgenerador es una elección terrible porque no escala . Para la portabilidad, es mejor usarloSEQUENCEde forma predeterminada y cambiar aIDENTITYMySQL 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