You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一项目中同时使用Hibernate与JavaFX?求相关示例

同时使用JavaFX与Hibernate的实现方案及示例

一、项目依赖配置(以Maven为例)

在pom.xml中添加JavaFX、Hibernate及数据库驱动依赖,这里以H2内存数据库为例(无需额外安装,适合快速测试):

<dependencies>
    <!-- JavaFX 依赖 -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>17.0.6</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>17.0.6</version>
    </dependency>

    <!-- Hibernate 核心依赖 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>6.2.2.Final</version>
    </dependency>

    <!-- H2 数据库驱动 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.224</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

二、Hibernate核心配置

在src/main/resources下创建hibernate.cfg.xml,配置数据库连接、Hibernate参数及实体类扫描:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>

        <!-- Hibernate 参数 -->
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 实体类所在包 -->
        <mapping class="com.example.model.User"/>
    </session-factory>
</hibernate-configuration>

三、核心代码实现

1. 定义Hibernate实体类

创建com.example.model.User实体,映射数据库表:

package com.example.model;

import jakarta.persistence.*;

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false, unique = true)
    private String email;

    // 无参构造函数(Hibernate要求)
    public User() {}

    // 带参构造函数
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getter和Setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    @Override
    public String toString() {
        return name + " (" + email + ")";
    }
}

2. Hibernate会话工厂工具类

创建com.example.util.HibernateUtil,用于获取全局唯一的SessionFactory:

package com.example.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                    .configure("hibernate.cfg.xml")
                    .build();
            Metadata metadata = new MetadataSources(registry)
                    .getMetadataBuilder()
                    .build();
            sessionFactory = metadata.getSessionFactoryBuilder().build();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

3. 数据访问层(DAO)实现

创建com.example.dao.UserDAO,封装Hibernate的CRUD操作:

package com.example.dao;

import com.example.model.User;
import com.example.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.util.List;

public class UserDAO {
    // 保存用户
    public void saveUser(User user) {
        Transaction transaction = null;
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            transaction = session.beginTransaction();
            session.persist(user);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

    // 查询所有用户
    public List<User> getAllUsers() {
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            return session.createQuery("from User", User.class).list();
        }
    }
}

4. JavaFX UI层实现

主界面FXML(src/main/resources/com/example/view/user-view.fxml)

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<VBox spacing="10" padding="20" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.controller.UserController">
    <Label text="用户管理"/>
    <HBox spacing="10">
        <TextField fx:id="nameField" promptText="输入姓名"/>
        <TextField fx:id="emailField" promptText="输入邮箱"/>
        <Button text="添加用户" onAction="#addUser"/>
    </HBox>
    <ListView fx:id="userListView"/>
</VBox>

UI控制器(com.example.controller.UserController)

package com.example.controller;

import com.example.dao.UserDAO;
import com.example.model.User;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;

import java.util.List;

public class UserController {
    @FXML
    private TextField nameField;
    @FXML
    private TextField emailField;
    @FXML
    private ListView<User> userListView;

    private final UserDAO userDAO = new UserDAO();

    // 初始化方法,加载现有用户
    @FXML
    public void initialize() {
        loadUsers();
    }

    // 添加用户按钮事件
    @FXML
    private void addUser() {
        String name = nameField.getText().trim();
        String email = emailField.getText().trim();
        if (!name.isEmpty() && !email.isEmpty()) {
            // 后台线程执行数据库操作,避免阻塞UI线程
            new Thread(() -> {
                userDAO.saveUser(new User(name, email));
                // 更新UI必须在JavaFX应用线程中执行
                Platform.runLater(this::loadUsers);
            }).start();
            nameField.clear();
            emailField.clear();
        }
    }

    // 加载用户列表到ListView
    private void loadUsers() {
        List<User> users = userDAO.getAllUsers();
        userListView.getItems().setAll(users);
    }
}

JavaFX主类(com.example.Main)

package com.example;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class Main extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("view/user-view.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 400, 300);
        stage.setTitle("JavaFX + Hibernate Demo");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

四、关键注意事项

  • 线程安全:Hibernate的Session不是线程安全的,必须保证每个数据库操作使用独立的Session;同时JavaFX的UI更新必须在应用线程中执行,因此数据库操作要放在后台线程,更新UI时用Platform.runLater()。
  • 资源管理:使用try-with-resources自动关闭Session,避免资源泄漏。
  • 实体类要求:必须提供无参构造函数,Hibernate需要通过它实例化对象。

内容的提问来源于stack exchange,提问作者hedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:39:16