246

为什么我会收到此异常?

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
4

10 回答 10

500

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

如果您不希望您的实体保留在单独的表中,而是希望成为其他实体的一部分,您可以使用@Embeddable代替@Entity.

如果您只是想要一个数据传输对象来保存来自休眠实体的一些数据,请不要在其上使用任何注释 - 将其保留为简单的 pojo。

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

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

于 2010-12-07T20:40:24.347 回答
235

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

于 2017-09-20T06:22:36.127 回答
69

当您为 @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;
于 2017-12-05T11:06:41.370 回答
13

下面的代码可以解决 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,那么你可以声明一些更像上面声明的方法。

于 2015-10-05T07:01:05.663 回答
6

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

    import org.springframework.data.annotation.Id;

通常,它应该是:

    import javax.persistence.Id;
于 2020-02-12T02:56:47.530 回答
6

TL;博士

您缺少@Id实体属性,这就是 Hibernate 抛出该异常的原因。

实体标识符

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

有两种类型的标识符:

  • 分配
  • 自动生成

分配的标识符

分配的标识符如下所示:

@Id
private Long id;

请注意,我们使用的是包装器(例如 , LongInteger而不是原始类型(例如long, int)。在使用 Hibernate 时使用包装器类型是更好的选择,因为通过检查是否id存在null,Hibernate 可以更好地确定实体是瞬态的(它没有关联的表行)还是分离的(它有关联的表行,但它不受当前持久性上下文管理)。

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

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

entityManager.persist(post);

自动生成的标识符

自动生成的标识符需要除以下@GeneratedValue注释之外的注释@Id

@Id
@GeneratedValue
private int id;

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

  • IDENTITY
  • SEQUENCE
  • TABLE

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

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

SEQUENCE除非您使用 MySQL,否则该策略是最佳选择。对于该 SEQUENCE策略,您还希望使用pooled优化器来减少在同一 Persistence Context 中持久化多个实体时的数据库往返次数。

生成器TABLE是一个糟糕的选择,因为它不能扩展。为了可移植性,您最好SEQUENCE默认使用并仅切换到IDENTITYMySQL。

于 2020-03-01T10:38:58.637 回答
4

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

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

   @EmbeddedId
   SampleEntityPK id;

 }
于 2019-11-18T04:56:11.357 回答
3
  1. 由于导入错误的包而出现此错误:
    import javax.persistence.Id;
  2. 而且你应该总是给表提供主键,否则会出错。
于 2020-10-26T08:43:41.677 回答
2

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

private static final long serialVersionUID = 1L;

当我完成表到实体的转换时,由 Eclipse JPA 工具自动生成。

删除上面解决问题的行

于 2019-01-10T12:25:07.890 回答
2

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

于 2020-02-29T15:56:46.577 回答