如何在同一项目中同时使用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
相关产品推荐
相关产品推荐

