org.hibernate.PropertyValueException:非null属性引用null或瞬时值OneToOne关系

时间:2020-10-05 11:22:38

标签: java hibernate maven

我刚开始休眠。该项目由Maven和Hibernate完成,但是我的关系存在一些我不了解的问题。

在我的模型中,我创建了一个Person类,秘书和Doctor继承了这个Person类,一个Account的User类 我的问题是在增加拥有帐户的医生或秘书的水平

Person类

@Entity
@Table(name = "personne")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Personne implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(length = 50)
    private String nom;

    @Column(length = 100)
    private String prenom;

    @Column(length = 13)
    private String tel;

Doctor类继承自Person类

@Entity
@Table(name = "medecin")
@PrimaryKeyJoinColumn(name = "id")
public class Medecin extends Personne implements Serializable {

    private static final long serialVersionUID = 1L;

    @OneToMany(mappedBy = "medecin")
    private List<Rendezvous> listeRv;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", referencedColumnName = "id", unique = false, nullable = true)
    private User user;

秘书类也继承自Person类

@Entity
@Table(name = "secretaire")
@PrimaryKeyJoinColumn(name = "id")
public class Secretaire extends Personne implements Serializable {

    private static final long serialVersionUID = 1L;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", referencedColumnName = "id", unique = false, nullable = true)
    private User user;

    @OneToMany(mappedBy = "secretaire")
    private List<Rendezvous> listeRv;

用于管理身份验证的用户类,具有用户的医生或秘书将可以连接,否则将为空

@Entity
@Table(name = "user" )
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(length = 150)
    private String email;

    @Column(length = 150)
    private String password;


    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL,
            fetch = FetchType.LAZY, optional = false)
    private Medecin medecin;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL,
            fetch = FetchType.LAZY, optional = false)
    private Secretaire secretaire;

@Entity
@Table(name = "rendezvous")
public class Rendezvous implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(length = 150)
    private String libelle;

    @Column(columnDefinition = "DATE")
    private LocalDate date;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "medecin_id")
    private Medecin medecin  = new Medecin();

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "secretaire_id")
    private Secretaire secretaire = new Secretaire();

User um = new User();
        um.setEmail("ngaryfaye95@gmail.com");
        um.setPassword("ngaryfaye");

        User us = new User();
        us.setEmail("aidasamb@gmail.com");
        us.setPassword("aidasall");

        Medecin m = new Medecin();
        m.setPrenom("Ahmadou Ngary");
        m.setNom("Faye");
        m.setTel("774124577");
        m.setUser(um);

        Secretaire s = new Secretaire();
        s.setNom("Sall");
        s.setPrenom("Aida Samb");
        s.setTel("775679809");
        m.setUser(us);

        Rendezvous rv = new Rendezvous();
        rv.setLibelle("Radio Cérébrale");
        rv.setDate(LocalDate.parse("2020-03-04"));
        rv.setSecretaire(s);
        rv.setMedecin(m);

        int d = iu.add(um);
        int e = iu.add(us);
        int a = im.add(m);
        int b = is.add(s);
        int c = ir.addRv(rv);


    org.hibernate.PropertyValueException: not-null property references a null or transient value : td.java.entities.User.medecin
        at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:111)
        at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:55)
        at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:116)
        at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:72)
        at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645)
        at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282)
        at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)
        at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317)
        at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:335)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:292)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:198)
        at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:128)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:193)
        at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:178)
        at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
        at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:618)
        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:611)
        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:606)
        at td.java.dao.IUser_implementation.add(IUser_implementation.java:25)
        at td.java.controller.rvMedecinController.initialize(rvMedecinController.java:90)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2655)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2517)
        at td.java.App.loadFXML(App.java:37)
        at td.java.App.start(App.java:26)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    org.hibernate.PropertyValueException: not-null property references a null or transient value : td.java.entities.User.medecin
        at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:111)
        at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:55)
        at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:116)
        at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:72)
        at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645)
        at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282)
        at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)
        at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317)
        at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:335)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:292)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:198)
        at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:128)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:193)
        at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:178)
        at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
        at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:618)
        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:611)
        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:606)
        at td.java.dao.IUser_implementation.add(IUser_implementation.java:25)
        at td.java.controller.rvMedecinController.initialize(rvMedecinController.java:91)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2655)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2517)
        at td.java.App.loadFXML(App.java:37)
        at td.java.App.start(App.java:26)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    org.hibernate.PropertyValueException: not-null property references a null or transient value : td.java.entities.User.medecin
        at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:111)
        at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:55)
        at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:116)
        at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:72)
        at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645)
        at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282)
        at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)
        at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317)
        at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:335)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:292)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:198)
        at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:128)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:193)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:178)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:99)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
        at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:598)
        at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:591)
        at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
        at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:492)
        at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:416)
        at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:218)
        at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:151)
        at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:432)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:269)
        at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:198)
        at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:128)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:193)
        at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:178)
        at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
        at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
        at 

org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
        at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:618)
        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:611)
        at org.hibernate.internal.SessionImpl.save(SessionImpl.java:606)
        at td.java.dao.IMededin_implementation.add(IMededin_implementation.java:26)
        at td.java.controller.rvMedecinController.initialize(rvMedecinController.java:92)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2655)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2517)
        at td.java.App.loadFXML(App.java:37)
        at td.java.App.start(App.java:26)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    Hibernate: insert into personne (nom, prenom, tel) values (?, ?, ?)
    Hibernate: insert into secretaire (user_id, id) values (?, ?)
    Hibernate: insert into rendezvous (date, libelle, medecin_id, secretaire_id) values (?, ?, ?, ?)
    java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: td.java.entities.Medecin
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:151)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
        at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1348)
        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:435)
        at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3221)
        at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2389)
        at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
        at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
        at td.java.dao.IRendezvous_implementation.addRv(IRendezvous_implementation.java:26)
        at td.java.controller.rvMedecinController.initialize(rvMedecinController.java:94)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2655)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2517)
        at td.java.App.loadFXML(App.java:37)
        at td.java.App.start(App.java:26)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: td.java.entities.Medecin
        at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:347)
        at org.hibernate.type.EntityType.getIdentifier(EntityType.java:495)
        at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:334)
        at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:345)
        at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:316)
        at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4540)
        at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:585)
        at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:242)
        at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:169)
        at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:233)
        at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:93)
        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
        at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1344)
        ... 21 more

我需要帮助

0 个答案:

没有答案
相关问题