Hibernate抛出org.hibernate.AnnotationException:没有为entity指定标识符:com..domain.idea.MAE_MFEView

为什么我得到这个异常?

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
459429 次浏览

您缺少一个带有@Id注释的字段。每个@Entity都需要一个@Id——这是数据库中的主键。

如果你不希望你的实体被持久化在一个单独的表中,而是作为其他实体的一部分,你可以使用@Embeddable而不是@Entity

如果您只是想要一个数据传输对象来保存来自hibernate实体的一些数据,那么不要在它上面使用任何注释——让它成为一个简单的pojo。

更新:关于SQL视图,Hibernate文档写道:

Hibernate映射的视图和基表之间没有区别。这在数据库级别是透明的

下面的代码可以解决NullPointerException。

@Id
@GeneratedValue
@Column(name = "STOCK_ID", unique = true, nullable = false)
public Integer getStockId() {
return this.stockId;
}
public void setStockId(Integer stockId) {
this.stockId = stockId;
}

如果你添加@Id,那么你可以声明一些类似上面声明的方法。

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

当您为@Id导入与Javax.persistance.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;

我知道听起来很疯狂,但我收到这样的错误,因为我忘记删除

private static final long serialVersionUID = 1L;

当一个表到实体转换时,由Eclipse JPA工具自动生成。

删除上面解决问题的行

使用@EmbeddableId为PK实体解决了我的问题。

@Entity
@Table(name="SAMPLE")
public class SampleEntity implements Serializable{
private static final long serialVersionUID = 1L;


@EmbeddedId
SampleEntityPK id;


}

我认为这个问题跟模型类导入错误。

    import org.springframework.data.annotation.Id;

通常情况下,它应该是:

    import javax.persistence.Id;

此错误是由导入错误的Id类引起的。将org.springframework.data.annotation.Id更改为javax.persistence.Id后,应用程序将运行

博士TL;

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

实体标识符

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

标识符有两种类型:

  • 分配
  • 自动生成的

指定的标识符

分配的标识符如下所示:

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

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

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


entityManager.persist(post);

自动生成的标识符

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

@Id
@GeneratedValue
private int id;

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

  • IDENTITY
  • SEQUENCE
  • TABLE

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

IDENTITY的问题是自动此策略禁用Hibernate批处理插入. c。

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

TABLE生成器是一个糟糕的选择,因为它不能缩放。为了可移植性,你最好默认使用__ABC1,然后切换到IDENTITY仅用于MySQL。

  1. 此错误是由于导入了错误的包:
    import javax.persistence.Id;
  2. 并且你应该总是给出表的主键,否则它会给出一个错误。
我在使用Intelij IDEA创建hibernate会话时遇到了同样的问题。 错误是:

注解异常:没有为实体指定标识符

如果在实体类中没有使用@ID注释,但在我的情况下,则会导致此错误

解决方法:

我从我的DAO类中删除了下面的导入语句

import jakarta.persistence.*;

并添加

import javax.persistence.*;

正如许多用户建议的那样。

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

意义:

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

在我的例子中: @Id注释是:"org.springframework.data.annotation.Id; 用package: "javax.persistence.Id"

我们需要关注两个方面。 一、正确的进口 2缺少注释< / p >

所需要的注释是

import javax.persistence.Id;
< p >和 需要注释

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