Hibernate抛出org.hibernate.AnnotationException异常:实体com..domain.idea.MAE_MFEView未指定标识符。

272

为什么我会收到这个异常?

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

顺便说一句,与问题无关,那是一个相当长的堆栈跟踪。您有一些重复的调用。您确定那里的一切都正确吗? - Bozho
不太确定为什么堆栈跟踪总是这么长。我认为有很多后台服务正在运行受到影响。 - Ramy
请注意,如果您的ID不是静态的或者类上有一些属性。这种情况曾经发生在我身上 :) - Gean Felipe
15个回答

1
在我的情况下: @Id注释是“org.springframework.data.annotation.Id;” 将其替换为“javax.persistence.Id”包后,应用程序正常工作。

0

我在使用Intelij IDEA创建Hibernate会话时遇到了同样的问题。

org.hibernate.AnnotationException: 未为实体指定标识符

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

解决方案:

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

import jakarta.persistence.*;

并添加了

import javax.persistence.*;

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


0

我们需要关注两个方面:

i.正确的导入

ii.缺少的注释

所需的注释为

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


0

正如有人已经提到的那样,如果您要持久化数据,则实体类缺少必须的@Id注释。

同样,@Id必须与@Entity属于相同的库。

意思是:

javax.persistence.Entity无法与org.springframework.data.annotation.Id一起使用。实体和ID必须是Spring Data或Java Persistence API的一部分。建议使用Java Persistence API,因为它是通用的。


0
如果您的表格具有使每一行唯一的字段组合,您可以使用复合键而不需要一个ID字段。
例如
@Entity
@Table(name = "food_nutrient")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@IdClass(CompositeKey.class)
@EqualsAndHashCode
public class FoodNutrient implements Serializable {

CompositeKey是另一个类,类似于

public class CompositeKey implements Serializable {
    private Integer foodId;
    private Integer nutrientId;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CompositeKey key = (CompositeKey) o;
        if (foodId != key.foodId) return false;
        return nutrientId == key.nutrientId;
    }

    @Override
    public int hashCode() {
        return Objects.hash(foodId, nutrientId);
    }
}

然后你的表将有两个没有id字段的主键

+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| amount       | float        | YES  |     | NULL    |       |
| fdc_id       | int          | YES  |     | NULL    |       |
| food_id      | int          | NO   | PRI | NULL    |       |
| label_source | varchar(16)  | YES  |     | NULL    |       |
| name         | varchar(255) | YES  |     | NULL    |       |
| nutrient_id  | int          | NO   | PRI | NULL    |       |
| pct_dv       | int          | YES  |     | NULL    |       |
| unit_name    | varchar(16)  | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接