Question

i ont un problème tout en testant mon DAOObject. J'ai deux Entitys qui sont liés par une relation de @OneToOne. Les classes sont:

@Entity
@Table
public class Device extends HyEntity {

    @OneToOne(mappedBy = "device")
    private EndUser endUser;
    //getters+setters
}

et

@Entity
@Table
public class EndUser extends HyEntity {

    private String firstname;
    private String lastname;
    @OneToOne
    private Device device;
    //getters+setters
}

Dans le DAO je fais ce qui suit:

    Device d1 = new Device();

    EndUser e1 = new EndUser();
    e1.setFirstname("Hans");
    e1.setLastname("Muster");
    e1.setDevice(d1);

    repo.saveEntity(d1);
    repo.saveEntity(e1);
    sf.getCurrentSession().flush();
    repo.updateEntity(d1);
    sf.getCurrentSession().flush();

    Assert.notNull(repo.getEndUserById(e1.getId()));
    Assert.notNull(repo.getEndUserById(e1.getId()).getDevice());
    Assert.notNull(repo.getDeviceById(d1.getId()));

    sf.getCurrentSession().flush();
    d1 = repo.getDeviceById(d1.getId());
    Hibernate.initialize(d1); 
    Hibernate.initialize(d1.getEndUser());
    Assert.notNull(repo.getDeviceById(d1.getId()).getEndUser()); //FAILS endUser of Device is always NULL

Comme vous pouvez le voir, ni session.flush () ne fonctionne Hibernate.Initalize. L'utilisateur final n'assigend à l'appareil. Si je retire le @Transactional, ... tout fonctionne comme il se doit. Y at-il un moyen d'obtenir ce travail? Sinon, je vais devoir toujours supprimer les entités créées dans la base de données manuellement après le test, ce qui est assez Anoying.

En espérant une réponse.

Merci à l'avance.

Était-ce utile?

La solution

Vous devez ajouter un clear() après le dernier rinçage. Si vous oubliez que, que veille prolongée retournera exactement le même instance de son cache interne, où le releationship est pas mis à jour.

De toute façon, à mon avis personnel, il est une mauvaise pratique de ne pas mettre le navire relation des deux côtés à la main. - Parce que si vous ne devez pas le paramétrer, vous avez toujours des deux côtés prendre soin que l'entité est rechargée à partir de la base de données. Et si vous ne rechargez pas l'entité de la base de données que ... (voir le test).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top