web-dev-qa-db-ja.com

休止状態例外:org.hibernate.AnnotationException:エンティティに識別子が指定されていません: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
172
Ramy

@Idという注釈が付いたフィールドがありません。それぞれの@Entity@Idを必要とします - これはデータベースの主キーです。

エンティティを別のテーブルに保持したくない場合は、他のエンティティの一部にしたい場合は、@Embeddableの代わりに@Entityを使用できます。

単純にデータ転送オブジェクトに休止状態エンティティからのデータを保持させたい場合は、そのオブジェクトに注釈を付けないでください。単純なpojoのままにしてください。

更新:SQLビューに関して、Hibernateのドキュメントは次のように書いています。

Hibernateマッピングのビューと基本テーブルの間に違いはありません。これはデータベースレベルでは透過的です

363
Bozho

私にとっては、javax.persistence.Idの代わりにorg.springframework.data.annotation.Idを使用する必要があります。この問題に遭遇した人は誰でも、正しいIdクラスをインポートしたかどうかを確認できます。

111
Searene

Javax.persistance.Id;と異なるライブラリを@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;
45
tadtab

以下のコードは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を追加すると、上記の宣言されたメソッドのようにさらに宣言することができます。

私はクレイジーに聞こえますが、私は削除することを忘れているので私はそのようなエラーを受けました

private static final long serialVersionUID = 1L;

テーブルからエンティティへの変換時にEclipse JPAツールによって自動的に生成されました。

上記の行を削除すると問題が解決しました

2
ittradco