【问题标题】:Hibernate NullPointerException java fx [duplicate]Hibernate NullPointerException java fx [重复]
【发布时间】:2019-09-16 18:57:52
【问题描述】:

当我尝试保存用户会话时,出现异常。有什么问题?

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)

SignUpController 类:

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.java:39。请在您的问题中包含 SignUpController.java 中的第 39 行。
  • @VGR 我换了。
  • 第 39 行是哪一行?
  • @VGR user.setUsername(usernameField);如果我删除它,下一行 user.setPassword(passwordField); 会有一个异常;等等。仅限用户字段
  • User 类从不给instance 赋值。

标签: java hibernate


【解决方案1】:

问题不是 Hibernate(至少不是这个异常)而是你的类控制器,所以

你在类SignUpController中有一个空指针,因为你犯了两个错误,所以,你的类里面的属性全部为空,因为你没有在属性上插入注释@FXML,所以你改变了你的用 this 声明适当性

@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里面你可以初始化属性而不是动作,JavaFx可以使用注解来标记动作等方法,你可以在你的方法上使用@FXML。

一个例子,如果你有方法

@FXML
public void print(ActionEvent a){//op}

为了工作@FXML注解,你需要文件FXML里面的信息来创建GUI,一个例子,前面的信息

<JFXButton fx:id="singUp" onAction="#print" />
<JFXTextField fx:id="username" />

如果您是 JavaFX 新手,可以查看我的简单应用程序 here。


休眠错误

在此代码中,您使用 Hibernate 进行了打开会话,但未运行查询,并且您的 User 实例为 null

Session session = HibernateSessionFactory.getSessionFactory().openSession();
            User user = User.getInstance();

为了让用户进入数据库,你必须使用休眠会话,一个例子

Session session = HibernateSessionFactory.getSessionFactory().openSession();
 User user = HibernateSessionFactory.getSessionFactory().get(User.class, USER_ID);

如果你没有 id,你可以使用 Creteria 如果你使用 Hibernate 4 或者如果你使用 Hibernate 5 看这个reference


我对这段代码的看法

public class User {
    private static User instance;
}

我认为使用休眠模式对单例模式没有更多意义

【讨论】:

  • 如果我保存的是字符串而不是usernameField、passwordField等,异常会一直存在
  • 我的错,我更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多