исключение гибернации: org.hibernate.AnnotationException: для сущности не указан идентификатор: com..domain.idea.MAE_MFEView - PullRequest
172 голосов
/ 07 декабря 2010

Почему я получаю это исключение?

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

Ответы [ 5 ]

370 голосов
/ 07 декабря 2010

Вам не хватает поля, отмеченного @Id. Каждому @Entity нужен @Id - это первичный ключ в базе данных.

Если вы не хотите, чтобы ваша сущность сохранялась в отдельной таблице, а была частью других сущностей, вы можете использовать @Embeddable вместо @Entity.

Если вы хотите, чтобы просто объект передачи данных содержал некоторые данные из спящего объекта, не используйте для этого никаких аннотаций - оставьте это простым pojo.

Обновление: Что касается представлений SQL, документы Hibernate пишут:

Нет разницы между представлением и базовой таблицей для отображения Hibernate. Это прозрачно на уровне базы данных

113 голосов
/ 20 сентября 2017

Для меня javax.persistence.Id следует использовать вместо org.springframework.data.annotation.Id. Для тех, кто сталкивался с этой проблемой, вы можете проверить, импортировали ли вы правильный Id класс.

47 голосов
/ 05 декабря 2017

Эта ошибка может возникать при импорте библиотеки @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;
13 голосов
/ 05 октября 2015

Код ниже может решить исключение 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, то вы можете объявить еще несколько таких же методов, как указано выше.

2 голосов
/ 10 января 2019

Я знаю, это звучит странно, но я получил такую ​​ошибку, потому что я забыл удалить

private static final long serialVersionUID = 1L;

, автоматически сгенерированный инструментом Eclipse JPA при преобразовании таблицы в сущности.

Удалениестрока выше, решившая проблему

...