Hibernateがorg.hibernate.AnnotationExceptionをスローします:エンティティに識別子が指定されていません:com..domain.idea.MAE_MFEView


207

なぜこの例外が発生するのですか?

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

回答:


433

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

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

データ転送オブジェクトが休止状態のエンティティからのデータを保持するだけの場合は、アノテーションを一切使用せず、単純なpojoのままにします。

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

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


2
@Idフィールドが必要ですか?私の見解には、厳密にはIDがありません。
Ramy

「ビュー」とはどういう意味ですか。Hibernateには「ビュー」はありません。モデルしかない。
Bozho

1
さて、ビューにいくつかのIDを割り当てます。それなしでは行けません。各行(オブジェクト)は一意に識別される必要があります。
Bozho

@Idを追加した後に新しい例外が発生する
Ramy

3
ありがとうございました!これにより、迷惑なNullPointerFromHellExceptionが修正されました。
マリックス2014

172

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


2
あなたは私の日を救った: ')
Amitrajit Bose

同様の問題がありました。
AngelThread

59

このエラーは、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;

1
価値あるアドバイス.. deorgate org.springframework.data.annotation.Id plz
Christian Meyer

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、上記の宣言されたメソッドのように、さらにいくつかを宣言できます。


becoz ur @Id値が割り当てられず、ヌルポインター例外が発生した場所で更新されませんでした...
Shivendra Prakash Shukla

2

私は狂ったように聞こえますが、削除するのを忘れたのでそのようなエラーを受け取りました

private static final long serialVersionUID = 1L;

テーブルからエンティティへの変換を実行すると、Eclipse JPAツールによって自動的に生成されます。

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


1

PKエンティティに@EmbeddableIdを使用すると問題が解決しました。

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

   @EmbeddedId
   SampleEntityPK id;

 }

1

この問題は、モデルクラスのインポートが間違っていると考えられます。

    import org.springframework.data.annotation.Id;

通常は次のようになります。

    import javax.persistence.Id;

1

TL; DR

@Identityプロパティがないため、Hibernateがその例外をスローします。

エンティティ識別子

JPAエンティティーには、Idアノテーションが付けられたIDプロパティーが必要です。

識別子には2つのタイプがあります。

  • 割り当てられた
  • 自動生成

割り当てられた識別子

割り当てられた識別子は次のようになります。

@Id
private Long id;

我々は(例えば、ラッパーを使用していることに注意してくださいLongInteger代わりにプリミティブ型(例えば、の)longint)。ラッパー・タイプを使用するため、かどうかをチェックすることによって休止状態を使用してより良い選択で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

IDENTITY基礎となるデータベースがシーケンスをサポートしている場合(たとえば、Oracle、PostgreSQL、MariaDB 10.3以降、SQL Server 2012以降)、この戦略は回避されます。シーケンスをサポートしない唯一の主要なデータベースはMySQLです。

の問題IDENTITYは、この戦略では自動Hibernateバッチ挿入が無効になっていることです。このトピックの詳細については、こちらの記事をご覧ください。

SEQUENCEMySQLを使用している場合を除き、この戦略が最良の選択です。この SEQUENCE戦略では、同じ永続化コンテキストで複数のエンティティを永続化するときに、pooledオプティマイザを使用してデータベースの往復回数を減らすこともできます。

TABLEので、発電機はひどい選択肢であることは拡張できませんこの記事で説明するように、移植性を高めるためにSEQUENCE、デフォルトIDENTITYでMySQLのみに切り替えて使用することをお勧めします。


最初の例では、を使用しない@GeneratedValueでください。
Josef Cech

0

このエラーは、間違ったIdクラスをインポートしたために発生しました。org.springframework.data.annotation.Idをjavax.persistence.Idに変更すると、アプリケーションが実行されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.