web-dev-qa-db-de.com

EntityNotFoundException im Hibernate-Many-To-One-Mapping, obwohl Daten vorhanden sind

Ich erhalte den Fehler javax.persistence.EntityNotFoundException, wenn ich versuche, den Benutzer durch das Invoice-Objekt zu bekommen

bill.getUser (). getId ()

Fehler ist wie folgt

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)

Entitätsklassen sind wie folgt (Getter und Setter sind nicht enthalten)

@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;
}
34
Badal Singh

Das Problem könnte sein, dass die direkte Entität nicht vorhanden ist, aber es könnte auch sein, dass die Entität, auf die von dieser Entität verwiesen wird, normalerweise für einen EAGER-Abruftyp oder optional = false.

Versuche dies:

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

Ich hatte das gleiche Problem und

@NotFound(action = NotFoundAction.IGNORE)

mein Problem gelöst.

69
ozeray

Wenn Sie @ManyToOne verwenden, muss die referenzierte Entität vorhanden sein. Die einzige andere Option besteht darin, dieses Feld als long anzugeben und die referenzierte Entität mittels einer separaten Abfrage abzurufen.

Löst eine Ausnahme aus (javax.persistence.EntityNotFoundException), anstatt null zurückzugeben, wenn die angeforderte Entität nicht gefunden wird.

Verwenden Sie die Annotation @NotFound, um diese Ausnahmebedingung zu beheben, wenn Sie diese Ausnahmesituation nur langsam laden und nicht manuell behandeln.

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

Ich hatte kürzlich ein ähnliches Problem, aber das Problem ist, dass ein Datensatz immer in der DB vorhanden ist. Also habe ich einige Nachforschungen angestellt und herausgefunden, dass die zwischengespeicherte Entität vor dem erneuten Laden aus der Datenbank als Entfernen und erneutes Laden markiert wurde. Es geschah in Hibernate 4.3.5 Final für mich Dann aktualisiere ich auf Hibernate 4.3.11 Final, was das Problem zu beheben scheint.

4
sendon1982

Nicht sicher, ob das auf Ihren Fall zutrifft. 

Ich hatte jedoch ein ähnliches Problem, bei dem ich direkt in der Datenbanktabelle X ein Update vorgenommen und ein Feld auf null gesetzt habe. In der Java-Klasse war das Feld jedoch @NotNull.

Wenn also eine andere Klasse Y ein X-Objekt mit ManyToOne hatte, konnte sie die Entität aufgrund des Nullwerts in der Entität nicht laden.

4
user3450922

bitte versuche folgendes

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.ALL) oder 

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

Verwenden Sie @NotFound (action = NotFoundAction.IGNORE), falls das übergeordnete Element nicht vorhanden ist

Bei Verwendung von cascade = CascadeType.ALL wird die übergeordnete Entität gelöscht

Vielleicht kommt man zu dieser Antwort und findet sie nützlich: In meinem Fall habe ich meine Entität als gelöscht markiert und Entität, die mit dieser Entität in Beziehung steht, konnte sie nicht finden. Das Ändern von gelöscht in falsch hat bei mir also funktioniert.

0
Khasan 24-7