hibernate注解自动生成数据表

2023-11-18

  按习惯来说,一般系统开发都是从数据库开始设计的。但从面向对象开发的角度,系统的设计应该基于对象模型的设计之上,主要考虑对象的设计和逻辑,然后按照对象模型生成数据库结构,利用hibernate的SchemaExport对象可以方便的实现这一点。另外,使用注解也省却了很多繁杂的配置工作,下面对hibernate注解自动生成数据表的过程做一个详细描述。

       一、环境搭载

      下载了最新的hibernate-release-4.0.0.CR7.zip,导入required包,这个例子是基于MySql数据库,因此还需要mysql-connector-java-5.1.5.jar

       二、配置

       hibernate的配置文件可以使用xml或者properties,这里使用的xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <hibernate-configuration>  
  7. <session-factory>  
  8.     <!-- 各属性的配置-->  
  9.     <!--为true表示将Hibernate发送给数据库的sql显示出来-->  
  10.     <property name="show_sql">true</property>  
  11.     <!-- SQL方言,这边设定的是MySQL -->  
  12.     <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>  
  13.     <!-- 一次读的数据库记录数 -->  
  14.     <property name="jdbc.fetch_size">50</property>  
  15.     <!-- 设定对数据库进行批量删除 -->  
  16.     <property name="jdbc.batch_size">30</property>  
  17.     <!--驱动程序-->  
  18.     <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  19.     <!-- JDBC URL -->  
  20.     <property name="connection.url">jdbc:mysql://localhost/fight_game?characterEncoding=utf-8</property>  
  21.     <!-- 数据库用户名-->  
  22.     <property name="connection.username">root</property>  
  23.     <!-- 数据库密码-->  
  24.     <property name="connection.password">root</property>  
  25.   
  26.         <!-- 使用本地事务jdbc事务,如果是使用全局jta事务,则需要配置为jta-->  
  27.   
  28.   <property name="current_session_context_class">thread</property>  
  29. <mapping class="cn.com.model.User" />  
  30. </session-factory>  
  31. </hibernate-configuration>    

        关于current_session_context_class配置项:

        通过hibernate操作数据库时,主要是通过session实现的,session可以简单的视为对数据库的一个链接,有它的生命周期。获取session在SessionFactory里有两个方法,getCurrentSession()和openSession(),后者每次都会新建一个session,它们的区别:

       1 、getCurrentSession创建的session会绑定到当前线程,而openSession不会。        

        2 、getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭

        因此,通常使用getCurrentSession()会方便高效一些,但需要在配置文件中配置current_session_context_class,可以有两个取值jta或者thread。

        引用: 使用Hibernate的大多数应用程序需要某种形式的“上下文相关的” session,特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常是困难的;不同的上下文对“当前”这个概念定义了不同的范围。在3.0版本之前,使用Hibernate的程序要么采用自行编写的基于 ThreadLocal的上下文session,要么采用HibernateUtil这样的辅助类,要么采用第三方框架(比如Spring或Pico),它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关session。         

        从3.0.1版本开始,Hibernate增加了SessionFactory.getCurrentSession()方法。一开始,它假定了采用JTA事务,JTA事务定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信,因为有好几个独立的JTA TransactionManager实现稳定可用,不论是否被部署到一个J2EE容器中,大多数(假若不是所有的)应用程序都应该采用JTA事务管理。基于这一点,采用JTA的上下文相关session可以满足你一切需要。        

        更好的是,从3.1开始,SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,我们引入了新的扩展接口 (org.hibernate.context.CurrentSessionContext)和新的配置参数 (hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔插。        

        请参阅 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契约的详细讨论。它定义了单一的方法,currentSession(),特定的实现用它来负责跟踪当前的上下文session。Hibernate内置了此接口的两种实现。       

org.hibernate.context.JTASessionContext - 当前session根据JTA来跟踪和界定。这和以前的仅支持JTA的方法是完全一样的。详情请参阅Javadoc。                                  org.hibernate.context.ThreadLocalSessionContext - 当前session通过当前执行的线程来跟踪和界定。详情也请参阅Javadoc。       

        这两种实现都提供了“每数据库事务对应一个session”的编程模型,也称作每次请求一个session。Hibernate session的起始和终结由数据库事务的生存来控制。假若你采用自行编写代码来管理事务(比如,在纯粹的J2SE,或者 JTA/UserTransaction/BMT),建议你使用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行,事务边界是声明式定义的,你不需要在代码中进行任何事务或 session管理操作。请参阅第 11 章 事务和并发一节来阅读更多的内容和示例代码。        hibernate.current_session_context_class 配置参数定义了应该采用哪个org.hibernate.context.CurrentSessionContext实现。注意,为了向下兼容,如果未配置此参数,但是存在org.hibernate.transaction.TransactionManagerLookup的配置,Hibernate会采用org.hibernate.context.JTASessionContext。一般而言,此参数的值指明了要使用的实现类的全名,但那两个内置的实现可以使用简写,即"jta"和"thread"。

         在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。

         三、编写持久化对象

[java]  view plain copy
  1. package cn.com.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.GenerationType;  
  9. import javax.persistence.Id;  
  10. import javax.persistence.Table;  
  11.   
  12. @Entity  
  13. @Table(name="t_user")  
  14. public class User implements Serializable{  
  15.     /** 
  16.      *  
  17.      */  
  18.     private static final long serialVersionUID = 1L;  
  19.   
  20.     private long id;  
  21.   
  22.     private String name;  
  23.       
  24.     @Id  
  25.     @GeneratedValue(strategy=GenerationType.IDENTITY)  
  26.     public long getId() {  
  27.         return id;  
  28.     }  
  29.   
  30.     public void setId(long id) {  
  31.         this.id = id;  
  32.     }  
  33.   
  34.     @Column(name="name",length=50)  
  35.     public String getName() {  
  36.         return name;  
  37.     }  
  38.   
  39.     public void setName(String name) {  
  40.         this.name = name;  
  41.     }  
  42.       
  43. }  
        所有对象编写完后,需要在配置文件中配置,这里为:<mapping class="cn.com.model.User" />

        四、测试

       Configuration configuration = new AnnotationConfiguration();
        configuration.configure();
        SchemaExport export = new SchemaExport(configuration);
        export.execute(true, true, false, true);
        SessionFactory factory = configuration.buildSessionFactory();
//        Session session = factory.openSession();
        Session session = factory.getCurrentSession();
        session.beginTransaction();
        User user = new User();
        user.setName("成都");
        session.save(user);
        session.getTransaction().commit();
//        session.close();

        关于SchemaExport对象有几个方法生成数据库结构。

       1、create(boolean script,boolean export)

        script:是否在控制台打印DDL语句,export为true时,会先执行drop再根据持久化对象create数据表,可能造成数据丢失,为false时,数据库需要先建立对应的数据表,否则会找不到表而报错,不会造成数据丢失。

        2、drop(boolean script,boolean export)

        script:是否在控制台打印DDL语句,export为true时,会执行drop操作,为false时不执行

        3、execute(boolean script, boolean export,boolean justDrop, boolean justCreate)

        当export为true时,justDrop为false,justCreate为true,如果对应的数据表不存在,则create,如果存在则不执行create操作

        当export为true时,justDrop为true,justCreate为false,执行drop操作

         因此,要新建数据表,最好使用create(true,true);

原文地址:http://blog.csdn.net/leiswpu/article/details/7077642

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hibernate注解自动生成数据表 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • org.springframework.validation.BeanPropertyBindingResult异常

    嗨 我是 spring 框架的新手 我做了一个小例子 我尝试使用 spring 验证 api 验证我的输入字段 这是代码 RequestMapping value applicationFormSubmit method RequestMe
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 用Anaconda安装TensorFlow

    一说起现在比较火的机器学习 深度学习之类的 不得不说的一定有谷歌的TensorFlow框架 关于TensorFlow我就不多说了 因为我对这个东西也不太了解 这才是第一次开始学习 那么今天要说的是就是在Windows平台上安装TensorF
  • 利用MVC做一个 常见的管理系统

    登陆的部分 gt 数据库 gt 表 admin id name pass regtime 表与类的映射关系 基于面向对象 转换成对象的操作 gt 登陆页面
  • Java课题笔记~ JSP开发模型

    MVC 1 JSP演化历史 1 早期只有servlet 只能使用response输出标签数据 非常麻烦 2 后来有了jsp 简化了Servlet的开发 如果过度使用jsp 在jsp中即写大量的java代码 有写html表 造成难于维护 难于
  • 积分路径上有奇点的积分_复变函数与积分变换 简明笔记(七):留数定理

    拖更了两年 最近终于开始补齐之前这篇稿子的内容 之后可能会在暑假期间慢慢写好 保证质量比保证完成速度更重要 留数理论是复积分和复级数理论结合的产物 在前面详细讨论过洛朗级数和柯西积分定理之后 导出留数理论是很正常的事情 系统建立留数理论 实
  • yaffs2文件系统坏块发生记(读写代码及注释)

    yaffs2文件系统坏块产生记 对于yaffs2文件系统来说 坏块管理无疑是最关键的问题 下面就Yaffs2文件系统读 写操作来分析坏块产生记 写操作 写chunk操作 参数1 yaffs dev结构 全局 参数2 要写的2048字节数据
  • pyecharts的各个系列配置项设置示例——个人整理与分享

    由于在使用pyecharts时我们有很多对图表的配置项设置需要用到全局配置项和系列配置项 因此在对pyecharts的图表进行介绍之前先进行个人在pyecharts官网对系列配置项学习的整理 因为个人在官网对代码的查看没有特别舒服 其中包含
  • Nuxt3如何使用Tailwindcss?

    最近在Nuxt3项目中使用tailwindcss碰到一些问题 经研究后把问题解决 为避免此类问题特此把解决过程写下来做个记录 Nuxt3官网 tailwindcss官网 创建Nuxt3应用 须确保node js版本大于16 11 Nuxt3
  • 搜索技巧

    搜索技巧 一 完全匹配搜索 里面的就是完全搜索 例如 胡文迪 就会找完全匹配胡文迪三个字的相关结果 如果没有检索到 二 搜索范围限定在标题 intitle xx allintitle xx xx 在查询词前加上intitle xx 如果是多
  • 步进电机 - 构造与动作原理(二)

    第2章 构造与动作原理 2 1 构造 1 基本构造与动作原理 通过简易的示图讲解步进电动机的基本构造和动作原理 基本构造和动作原理 下图为步进电动机简易示图 对线圈L1进行通电时 L1会被磁化 中间部分的磁铁被LI吸引 并于平衡后停止 对线
  • 解决IntelliJ IDEA 项目结构旁边出现 0%classes,0% lines covered

    解决IntelliJ IDEA 项目结构旁边出现 0 classes 0 lines covered 官方文档解答 两种方法 解决IntelliJ IDEA 项目结构旁边出现 0 class 0 lines covered 官方文档解答 F
  • vector 查找/查找和对比结构体元素值

    原地转 http www cplusplus com reference algorithm find if include
  • SP706_MCU监控芯片

    SP706 MCU监控芯片 说明 SP706R S T系列是微处理器 P 监控电路系列 集成了离散解决方案的无数组件 监控 P和数字系统中的电源和电池 SP706R S T系列的功能包括看门狗定时器 P复置 电源故障比较器和手动重置输入 S
  • ELK 性能优化实践

    点击上方蓝色 方志朋 选择 设为星标 回复 666 获取独家整理的学习资料 一 背景介绍 近一年内对公司的 ELK 日志系统做过性能优化 也对 SkyWalking 使用的 ES 存储进行过性能优化 在此做一些总结 本篇主要是讲 ES 在
  • 小程序录音及其动画

    基础功能可以这样写 挺简单的 const recorderManager wx getRecorderManager const innerAudioContext wx createInnerAudioContext Page data
  • 拓世科技集团

    2023年 中国改革开放迎来了45周年 改革春风浩荡 席卷神州大地 45年间 中国特色社会主义伟大事业大步迈入崭新境界 一路上结出了饶为丰硕的果实 中华民族在这45年间的砥砺前行 不仅使中国的经济和社会发展达到了举世瞩目的成就 也在国家民主
  • 通过 ffmpeg 无损剪切/拼接视频

    剪切 拼接视频文件是一种常见需求 在线视频网站现在往往将一个视频文件分割成 n 段 以减少流量消耗 使用 DownloadHelper DownThemAll 这类工具下载下来的往往就是分割后的文件 能实现剪切 拼接视频文件的工具多种多样
  • java.lang.NumberFormatException: null的解决方法

    1 首先附上我的代码 Integer reviewid Integer valueOf request getParameter reviewid System out println reviewid Integer articleid
  • 避免’sudo echo x >’(sudo 重定向) 时’Permission denied’

    避免 sudo echo x gt 时 Permission denied 甲 示例 sudo echo a gt 1 txt bash 1 txt Permission denied 乙 分析 bash 拒绝这么做 说是权限不够 这是因为
  • 【Linux之Shell脚本实战】Linux创建新用户脚本

    Linux之Shell脚本实战 Linux创建新用户脚本 一 脚本要求 二 本地环境介绍 三 配置脚本注释模板 1 编辑 vimrc 文件 2 检查模板生效情况 四 编辑useradd sh 1 新建脚本目录 2 编辑useradd sh脚
  • hibernate注解自动生成数据表

    按习惯来说 一般系统开发都是从数据库开始设计的 但从面向对象开发的角度 系统的设计应该基于对象模型的设计之上 主要考虑对象的设计和逻辑 然后按照对象模型生成数据库结构 利用hibernate的SchemaExport对象可以方便的实现这一点