web-dev-qa-db-fra.com

EntityNotFoundException dans Hibernate mappage Plusieurs vers un, mais des données existantes

J'obtiens une erreur javax.persistence.EntityNotFoundException lorsque j'essaie d'obtenir l'utilisateur via l'objet de facture

invoice.getUser (). getId ()

L'erreur est la suivante

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)

Les classes d’entités sont les suivantes (les getters et les setters ne sont pas inclus)

@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

Le problème peut être que l'entité directe n'existe pas, mais également que l'entité référencée à partir de cette entité, normalement pour un type d'extraction EAGER, ou optionnelle = false.

Essaye ça:

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

J'ai eu le même problème, et

@NotFound(action = NotFoundAction.IGNORE)

résolu mon problème.

69
ozeray

Si vous utilisez @ManyToOne, l'entité référencée doit exister. La seule autre option consiste à spécifier ce champ en tant que long et à récupérer l'entité référencée au moyen d'une requête distincte.

Lève une exception (javax.persistence.EntityNotFoundException) au lieu de renvoyer null s'il ne peut pas trouver l'entité demandée.

Utilisez l'annotation @NotFound pour résoudre cette exception si vous chargez en différé et ne gérez pas cette exception manuellement.

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

J'ai eu le même problème récemment, mais le problème est que l'enregistrement existe toujours dans DB. J'ai donc fait quelques recherches et découvert qu'à un moment donné, l'entité mise en cache était marquée comme suppression et le rechargement avait échoué avant le rechargement à partir de la base de données. C'est arrivé dans Hibernate 4.3.5 Final pour moi Ensuite, je suis passé à Hibernate 4.3.11 Final, ce qui semble résoudre le problème.

4
sendon1982

Je ne sais pas si cela s'applique à votre cas. 

Mais j'ai eu un problème similaire où j'ai mis à jour directement dans la table de base de données X et défini un champ nul, mais dans la classe Java le champ était @NotNull.

Ainsi, lorsqu'une autre classe Y avait un objet X avec ManyToOne, il était impossible de charger l'entité en raison de la valeur nulle dans l'entité.

4
user3450922

s'il vous plaît essayez ce qui suit

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

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

Utilisez @NotFound (action = NotFoundAction.IGNORE) au cas où son parent n'existe pas

En utilisant cascade = CascadeType.ALL, il supprimera son entité parente

0