如何用JPA实现SQL Server简单插入?插入失败及配置疑问
关于Hibernate插入失败与配置文件的问题解答
嘿,我来帮你捋清楚这个问题!首先明确说:是的,Hibernate必须要有核心配置(要么是hibernate.cfg.xml文件,要么用代码硬编码配置参数)才能正常和数据库交互,你现在遇到的插入操作没执行、主类报错,大概率就是因为缺少这个关键配置。
一、为什么Hibernate需要这个配置?
Hibernate作为ORM框架,得知道一堆关键信息才能干活:
- 怎么连你的SQL Server?(连接URL、用户名、密码)
- 用什么SQL方言适配SQL Server?
- 哪些类是实体类?(比如你的
Personel) - 是否自动创建/更新数据库表?
- 要不要显示执行的SQL方便调试?
这些信息如果不告诉Hibernate,它根本不知道该怎么操作数据库,自然会报错。
二、给你一份适配SQL Server的hibernate.cfg.xml示例
把这个文件放在项目的src/main/resources目录下(Maven/Gradle项目)或者src根目录里:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库连接参数,替换成你自己的信息 --> <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;databaseName=你的数据库名;encrypt=true;trustServerCertificate=true</property> <property name="hibernate.connection.username">你的数据库用户名</property> <property name="hibernate.connection.password">你的数据库密码</property> <!-- SQL Server对应的方言,根据你的版本调整 --> <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2012Dialect</property> <!-- 告诉Hibernate你的实体类在哪 --> <mapping class="JpaTestPackage.Personel"/> <!-- 调试用:显示执行的SQL语句 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-- 表生成策略,开发环境用update很方便,生产环境别乱用 --> <property name="hibernate.hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration>
三、主类里要正确加载配置并处理事务
你的JavaJpaTestImpl得这么写才能正常执行插入,尤其是事务提交这一步绝对不能忘:
package JpaTestPackage; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class JavaJpaTestImpl { public static void main(String[] args) { // 加载Hibernate配置文件 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = null; try { session = sessionFactory.openSession(); // 一定要开启事务 session.beginTransaction(); // 创建你的Personel实例,设置属性 Personel person = new Personel(); person.setXXX("对应属性值"); // 替换成你实体类里的属性 // 保存实体 session.save(person); // 提交事务!这步没做的话,数据根本不会写入数据库 session.getTransaction().commit(); System.out.println("数据插入成功啦!"); } catch (Exception e) { // 出错了就回滚事务 if (session != null && session.getTransaction().isActive()) { session.getTransaction().rollback(); } e.printStackTrace(); } finally { // 别忘了关闭资源 if (session != null) session.close(); sessionFactory.close(); } } }
四、还要排查这些坑
- 实体类的主键注解:你给的
Personel代码里没显示主键部分,一定要给主键字段加上@Id注解(比如@Id private Long id;),Hibernate要求所有实体必须有主键。 - 事务没提交:很多新手会忘了调用
commit(),导致Hibernate只是缓存了数据,根本没写入数据库。 - 数据库权限:确认你的数据库用户有插入数据的权限,别因为权限不足导致操作失败。
内容的提问来源于stack exchange,提问作者Kerem GUL
相关产品推荐
相关产品推荐

