Hibernate NullPointerException java fx

Hibernate NullPointerException java fx,java,hibernate,Java,Hibernate,当我试图保存一个用户会话时,我得到一个异常。有什么问题 Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at controllers.SignUpController.lambda$initialize$0(SignUpController.java:36) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEve

当我试图保存一个用户会话时,我得到一个异常。有什么问题

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at controllers.SignUpController.lambda$initialize$0(SignUpController.java:36)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:432)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
注册控制器类:

import connection.HibernateSessionFactory;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import org.hibernate.Session;
import tables.User;

import java.io.IOException;

public class SignUpController {
    public TextField username;
    public PasswordField password;
    public Button back;
    public TextField name;
    public TextField surname;
    public Button signUp;

    @FXML
    void initialize() {
        signUp.setOnAction(event -> {
            String usernameField = username.getText();
            String passwordField = password.getText();
            String nameField = name.getText();
            String surnameField = surname.getText();


            Session session = HibernateSessionFactory.getSessionFactory().openSession();
            User user = User.getInstance();
            user.setUsername(usernameField);
            user.setPassword(passwordField);
            user.setName(nameField);
            user.setSurname(surnameField);
            session.save(user);

            session.close();

//            User user = new User(usernameField, passwordField, nameField, surnameField);
//            Clicks clicks = new Clicks(0);
//
//            Session session = HibernateSessionFactory.getSessionFactory().openSession();
//            Transaction transaction = session.beginTransaction();
//            clicks.setUser(user);
//            user.addClicks(clicks);
//            session.save(user);
//            transaction.commit();
//            session.close();

        });

        back.setOnAction(event -> {
            back.getScene().getWindow().hide();
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("/fxml/login.fxml"));
            try {
                loader.load();
            } catch (IOException e) {
                e.printStackTrace();
            }

            Parent root = loader.getRoot();
            Stage stage = new Stage();
            stage.setScene(new Scene(root));
            stage.show();
        });
    }
}
我的HibernateSessionFactory类:

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import tables.Clicks;
import tables.User;

public class HibernateSessionFactory {
    private static SessionFactory sessionFactory;


    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) try {
            Configuration configuration = new Configuration().configure();
            configuration.addAnnotatedClass(User.class);
            configuration.addAnnotatedClass(Clicks.class);
            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
            sessionFactory = configuration.buildSessionFactory(builder.build());
        } catch (Exception e) {
            System.out.println(e);
        }
        return sessionFactory;
    }
}
用户类别:

import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "users")
public class User {
    private static User instance;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int id;
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;
    @Column(name = "name")
    private String name;
    @Column(name = "surname")
    private String surname;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Clicks> clicks;

    public User() {
    }

    private User(int id) {
    }

    public User(String username, String password, String name, String surname) {
        this.username = username;
        this.password = password;
        this.name = name;
        this.surname = surname;
        clicks = new ArrayList<>();
    }

    public static User getInstance() {

        if (instance == null) {
            new User();
        }
        return instance;
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public void addClicks(Clicks click) {
        click.setUser(this);
        clicks.add(click);

    }

    public List<Clicks> getClicks() {
        return clicks;
    }

    public void setClicks(List<Clicks> clicks) {
        this.clicks = clicks;
    }
}

问题不在于休眠,至少不在于此异常,而在于您的类控制器,所以

您在类SignUpController中有一个空指针,因为您犯了两个错误,因此,您在类中的property全部为空,因为您没有在property上插入注释@FXML,因此您可以使用此命令更改您的声明property

@FXML
public TextField username;
@FXML
public PasswordField password;
@FXML
public Button back;
@FXML
public TextField name;
@FXML
public TextField surname;
@FXML
public Button signUp;
同样在initialize中,您可以初始化proprity而不是action,使用JavaFx可以使用注释标记方法,例如action,您可以在方法上使用@FXML

举个例子,如果你有这个方法

@FXML
public void print(ActionEvent a){//op}
对于@FXML注释的工作,您需要FXML文件中的信息来创建GUI,例如前面的信息

<JFXButton fx:id="singUp" onAction="#print" />
<JFXTextField fx:id="username" />
为了让用户访问数据库,必须使用hibernate会话,例如

Session session = HibernateSessionFactory.getSessionFactory().openSession();
 User user = HibernateSessionFactory.getSessionFactory().get(User.class, USER_ID);
如果您没有id,可以使用Hibernate 4或Hibernate 5,如下所示

我对这一准则的看法

public class User {
    private static User instance;
}

我认为对于hibernate,单例模式没有更多的意义

注意堆栈跟踪的第一行如何包含SignUpController.java:39。请在您的问题中包括SignUpController.java中的第39行。@VGR我已替换。哪一行是第39行?@VGR user.setUserNameUserField;如果我删除它,下一行user.setPasswordpasswordField将出现异常;等等仅对用户字段用户类从不为实例赋值。如果我保存字符串而不是UserName字段、passwordField等,则异常将保留在我的错误中,我更新了答案
public class User {
    private static User instance;
}