web-dev-qa-db-ja.com

Hibernateの多対1マッピングのEntityNotFoundException

Invoiceオブジェクトを介してユーザーを取得しようとすると、javax.persistence.EntityNotFoundExceptionエラーが発生します

invoice.getUser()。getId()

エラーは次のとおりです

javax.persistence.EntityNotFoundException: Unable to find com.indianretailshop.domain.User with id 5
    at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.Java:137)
    at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.Java:189)
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.Java:178)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.Java:215)

エンティティクラスは次のとおりです(ゲッターとセッターは含まれません)

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

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private int id;

    .
        .
        .

    //bi-directional many-to-one association to Invoice
    @OneToMany(mappedBy="user")
    private List<Invoice> invoices;
}

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

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private int id;
        .
        .
        .

    //bi-directional many-to-one association to User
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="Users_id")
    private User user;
}
38
Badal Singh

問題は、直接のエンティティが存在しないことですが、通常はEAGERフェッチタイプの場合、そのエンティティから参照されているエンティティ、またはoptional = falseである可能性もあります。

これを試して:

     //bi-directional many-to-one association to User
     @ManyToOne(fetch=FetchType.LAZY)
     @JoinColumn(name="Users_id")
     private User user = new User();
20
rajesh kakawat

私は同じ問題を抱えていた、と

@NotFound(action = NotFoundAction.IGNORE)

私の問題を解決しました。

81
ozeray

@ManyToOneを使用する場合、参照されるエンティティが存在する必要があります。他の唯一のオプションは、そのフィールドをlongとして指定し、別のクエリを使用して参照エンティティを取得することです。

要求されたエンティティが見つからない場合はnullを返す代わりに、例外(javax.persistence.EntityNotFoundException)をスローします。

遅延読み込みで、この例外を手動で処理しない場合は、@ NotFoundアノテーションを使用してこの例外を解決してください。

 @ManyToOne(
        fetch = FetchType.LAZY)
    @NotFound(
        action = NotFoundAction.IGNORE)
    @JoinColumn(
        name = COLUMN,
        referencedColumnName = COLUMN,
        insertable = false,
        updatable = false)
    private Table table;
29
shane lee

最近、同様の問題が発生しましたが、問題はレコードが常にDBに存在することです。そこで、調査を行ったところ、ある時点で、キャッシュされたエンティティが削除としてマークされ、DBからリロードする前にリロードが失敗することがわかりました。 Hibernate 4.3.5最終的にはそれからHibernate 4.3.11問題を修正するようです。

4
sendon1982

それがあなたのケースに当てはまるかどうかわかりません。

しかし、データベーステーブルXを直接更新し、フィールドをnullに設定するという同様の問題がありましたが、Javaクラスではフィールドは@NotNullでした。

そのため、別のクラスYにManyToOneを持つXオブジェクトがある場合、エンティティのnull値のためにエンティティをロードできませんでした。

4
user3450922

以下を試してください

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.ALL)または

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)
1
Haroon

親が存在しない場合は、@ NotFound(action = NotFoundAction.IGNORE)を使用します

Cascade = CascadeType.ALLを使用して、親エンティティを削除します

たぶん、この答えにたどり着いて、役に立つと思うかもしれません:私の場合、私は自分のエンティティを削除済みとしてマークし、このエンティティと関係のあるエンティティはそれを見つけることができませんでした。だから、deletedをfalseに変更するとうまくいきました。

0
Khasan 24-7