为什么我得到这个异常?

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;
    }
}

更新:我修改了我的代码,看起来像这样:

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;
    }
}

但现在我得到这个异常:

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

当前回答

当您为@Id导入了不同于javax . persistence . id的库时,可能会抛出此错误;你可能也需要注意这个案子

在我的情况下,我有

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import org.springframework.data.annotation.Id;

@Entity
public class Status {

    @Id
    @GeneratedValue
    private int id;

当我像这样修改代码时,它起作用了

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import javax.persistence.Id;

@Entity
public class Status {

    @Id
    @GeneratedValue
    private int id;

其他回答

当您为@Id导入了不同于javax . persistence . id的库时,可能会抛出此错误;你可能也需要注意这个案子

在我的情况下,我有

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import org.springframework.data.annotation.Id;

@Entity
public class Status {

    @Id
    @GeneratedValue
    private int id;

当我像这样修改代码时,它起作用了

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import javax.persistence.Id;

@Entity
public class Status {

    @Id
    @GeneratedValue
    private int id;

对我来说,应该使用javax.persistence.Id而不是org.springframework.data.annotation.Id。对于遇到此问题的任何人,您可以检查是否导入了正确的Id类。

如果您使用IntelliJ(可能还有其他ide)的自动建议功能而没有仔细查看导入内容,通常会发生这种情况。

博士TL;

您丢失了@Id实体属性,这就是Hibernate抛出异常的原因。

实体标识符

任何JPA实体都必须具有标识符属性,该属性用Id注释标记。

标识符有两种类型:

分配 自动生成的

指定的标识符

分配的标识符如下所示:

@Id
private Long id;

注意,我们使用的是包装器(例如,Long, Integer)而不是基本类型(例如,Long, int)。 在使用Hibernate时,使用包装器类型是更好的选择,因为通过检查id是否为空,Hibernate可以更好地确定一个实体是暂时的(它没有关联的表行)还是分离的(它有关联的表行,但它不受当前持久性上下文的管理)。

分配的标识符必须由应用程序在调用persist之前手动设置:

Post post = new Post();
post.setId(1L);

entityManager.persist(post);

自动生成的标识符

自动生成的标识符除了@Id之外还需要@GeneratedValue注释:

@Id
@GeneratedValue
private int id;

Hibernate可以使用3种策略自动生成实体标识符:

身份 序列 表格

如果底层数据库支持序列(例如,Oracle, PostgreSQL, MariaDB从10.3开始,SQL Server从2012年开始),则应避免使用IDENTITY策略。唯一不支持序列的主要数据库是MySQL。

IDENTITY的问题在于该策略禁用了自动Hibernate批插入。

SEQUENCE策略是最好的选择,除非你使用MySQL。对于SEQUENCE策略,当在同一个Persistence Context中持久化多个实体时,还需要使用池优化器来减少数据库往返的次数。

TABLE生成器是一个糟糕的选择,因为它不能伸缩。为了可移植性,最好在默认情况下使用SEQUENCE,仅在MySQL中切换到IDENTITY。

我们需要关注两个方面。 一、正确的进口 2失踪的注释

所需要的注释是

import javax.persistence.Id;

而且 所需要的注释是

@Id

Java类示例

package com.oracle.dto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;

import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

@Entity
@Data
public class Question {
    @Id
    @Setter(value = AccessLevel.NONE)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "queGen")
    @SequenceGenerator(name = "queGen",sequenceName = "questionS",initialValue = 1,allocationSize = 1)
    private Integer qId;
    @Column(name="question_text",length = 200)
    private String question;
    @OneToOne
    @JoinColumn(name = "answerId")
    private Answer answer;
}

正如有人已经提到的实体类缺少@Id注释,这是必须的情况下,你要持久化你的数据。 同样,@Id必须与@Entity属于相同的库。

意义:

entity不能使用org.springframework.data.annotation.Id。Entity和Id都必须是Spring Data或Java Persistence API的一部分。建议使用Java Persistence API,因为它是通用的。