Por que estou recebendo essa exceção?
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;
}
}
Atualização: alterei meu código para ficar assim:
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;
}
}
mas agora estou recebendo essa exceção:
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
Respostas:
Está faltando um campo anotado com
@Id
. Cada@Entity
um precisa de@Id
- esta é a chave primária no banco de dados.Se você não deseja que sua entidade seja persistida em uma tabela separada, mas faça parte de outras entidades, você pode usar em
@Embeddable
vez de@Entity
.Se você deseja que simplesmente um objeto de transferência de dados retenha alguns dados da entidade de hibernação, não use anotações - deixe um simples pojo.
Atualização: Em relação às visualizações SQL, os documentos do Hibernate escrevem:
fonte
Para mim,
javax.persistence.Id
deve ser usado em vez deorg.springframework.data.annotation.Id
. Para quem encontrou esse problema, você pode verificar se importou aId
classe certa .fonte
Este erro pode ser gerado quando você importa uma biblioteca diferente para @Id que Javax.persistance.Id ; Você pode precisar prestar atenção também neste caso
No meu caso eu tinha
quando eu mudo o código assim, funcionou
fonte
O código abaixo pode resolver a NullPointerException.
Se você adicionar
@Id
, poderá declarar um pouco mais como o método declarado acima.fonte
Eu sei que parece loucura, mas recebi esse erro porque esqueci de remover
gerado automaticamente pela ferramenta Eclipse JPA quando uma transformação de tabela em entidades que eu fiz.
Removendo a linha acima que resolveu o problema
fonte
O uso de @EmbeddableId para a entidade PK resolveu meu problema.
fonte
Eu acho que esse problema após a importação errada da classe de modelo.
Normalmente, deve ser:
fonte
TL; DR
Está faltando a
@Id
propriedade da entidade, e é por isso que o Hibernate está lançando essa exceção.Identificadores de entidade
Qualquer entidade JPA deve ter uma propriedade identificadora, marcada com a
Id
anotação.Existem dois tipos de identificadores:
Identificadores atribuídos
Um identificador atribuído é o seguinte:
O identificador atribuído deve ser definido manualmente pelo aplicativo antes da chamada persistir:
Identificadores gerados automaticamente
Um identificador gerado automaticamente requer a
@GeneratedValue
anotação além de@Id
:Como expliquei neste artigo , existem 3 estratégias que o Hibernate pode usar para gerar automaticamente o identificador de entidade:
IDENTITY
SEQUENCE
TABLE
A
IDENTITY
estratégia deve ser evitada se o banco de dados subjacente suportar sequências (por exemplo, Oracle, PostgreSQL, MariaDB desde 10.3 , SQL Server desde 2012). O único banco de dados importante que não suporta sequências é o MySQL.A
SEQUENCE
estratégia é a melhor opção, a menos que você esteja usando o MySQL. Para aSEQUENCE
estratégia, você também deseja usar opooled
otimizador para reduzir o número de viagens de ida e volta ao banco de dados ao persistir várias entidades no mesmo Contexto de Persistência.O
TABLE
gerador é uma escolha terrível, porque não é escalável . Para portabilidade, é melhor usarSEQUENCE
por padrão e alternarIDENTITY
apenas para MySQL, conforme explicado neste artigo .fonte
@GeneratedValue
, certo?Este erro foi causado pela importação da classe de ID incorreta. Depois de alterar org.springframework.data.annotation.Id para javax.persistence.Id, o aplicativo é executado
fonte