hibernate生成实体类
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate生成实体类内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate生成实体类相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate生成实体类相关知识
-
Hibernate第二天 实现增删改查 一级缓冲等等Hibernate_day02 1 实体类编写规则 2 hibernate主键生成策略 3 实体类操作 (1)crud操作 (2)实体类对象状态 4 hibernate的一级缓存 5 hibernate的事务操作 (1)事务代码规则写法 6 hibernate其他的api(查询) 实体类编写规则 1 实体类有无参数构造 2 实体类属性私有的 3 私有的属性通过公开的set和get方法操作 4 hibernate要求实体类有一个属性作为唯一值 (1)一般使用id作为唯一值 5 hibernate建议 (1)如果定义属性,属性类型建议不使用基本数据类型,使用
-
实体类的动态生成(一)前言在应用开发中,通常都会涉及各种 POJO/POCO 实体类(DO, DTO, BO, VO)的编写,有时这些实体类还需要实现 INotifyPropertyChanged 接口以支持属性变更通知,一般我们都会手写这些代码或者通过工具根据数据库表定义抑或别的什么模板、映射文件之类的来生成它们。但是,在业务实现中往往伴随着诸如“如何简单且高效的获取某个实体实例有哪些属性发生过变更?”、“变更后的值是什么?”这样的问题,而大致的解决方法有:由实体容器来跟踪实例的属性变更;改造实体类(譬如继承特定实体基类,在基类中实现这些基础构造)。方法(1)需要配合一整套架构设计来提供支撑,也不是专为解决上述实体类的问题而设,并且实现和使用也都不够简单高效,故此略过不表。接下来我将通过几篇文章来详细阐述这些问题的来由以及解决方案,并给出完整的代码实现以及性能比对测试。关于源码下面将要介绍的所有代码均位于我们的开源系列项目(地址:https://github.com/Zongsoft),项目主要采用&nbs
-
Intellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程Intellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程Intellij IDEA 如何通过数据库表生成带注解的实体类 第一步:新建一个Maven项目。项目的名称为JpaDemo。我这里是通过idea插件对应的spring项目生成器https://start.spring.io,直接生成项目。如图:下一步,修改成对应项目的基本信息。如图:选择相应的依赖jar包。选择项目的位置完成创建温馨提示,之前需要安装好maven。 第二步:配置数据库连接。选择Mysql。配置数据库基本信息其实配置了这个数据库连接之后,是可以直接通过脚本进行导出数据库实体类了,但是这个导出的实体类比较简陋,需要进行修改比较多,或是需要自己进行修改生成脚本语句。如:通过generate POJOs.clj即可导出实体类。需要选一下实体类放置的地方。效果如下:但是以上的实体类没有带注解。那么我们通过项目中用到hibernate,或是jpa需要加注解怎么办,总不能一个个注解加上去吧。idea当然不会这么干啦。使用
-
Hibernate Reverse Engineering反向生成Pojo类报错1、在myeclipse中使用hibernate进行“Hibernate Reverse Engineering”报如下错: An internal error occurred during: "Generating Artifacts". Path must include project and resource name: / 找到工程下的 .myhibernatedata # Mon Jan 09 22:06:02 CST 2012 genBasicCompId=false sessionFactoryName= profile= daoSFId= version=3.1 jndiPath= detectM2M=false reStrategyClass= springDaoFile= useJavaTypes=false keyGenerator=native libInstall
hibernate生成实体类相关课程
-
新版Kubernetes生产落地全程实践 本课程从集群部署到业务迁移、持续集成再到核心知识点梳理,既能快速入门k8s,又能提升k8s生产落地能力,助你少走弯路,避免踩坑。
讲师:刘果国 高级 2138人正在学习
hibernate生成实体类相关教程
- 3. 没有中间表实体类的映射 如果中间表仅仅只是充当桥梁作用,没有程序需要的实质性数据时,程序中可以没有中间表对应的实体类。学生和课程的关系,直接在学生类和课程类中体现彼此关系就可以:新建课程实体类:@Entitypublic class Course { private Integer courseId; private String courseName; private String courseDesc; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getCourseId() { return courseId; } //省略其它代码}因为一名学生对应多门课程,在学生实体类中添加集合属性:private Set<Course> courses;完成程序级别上的关系描述后,还需告诉 Hibernate,实体类中的集合属性数据来自哪一张以及如何获取?为了把问题简单化,在学生实体类中只体现和课程的关系 ,前面映射内容注释或删除。学生实体类的完整描述:private Set<Course> courses;@ManyToMany(targetEntity = Course.class)@JoinTable(name = "score", joinColumns = @JoinColumn(name = "stuId", referencedColumnName = "stuId"), inverseJoinColumns = @JoinColumn(name = "courseId", referencedColumnName = "courseId"))public Set<Course> getCourses() { return courses;}@ManyToMany 告诉 Hibernate, course 集合中的数据来自课程表 ;@JoinTable 告诉 Hibernate 获取课程表中数据时需要借助 score 中间表。分别描述中间表和学生表、课程表的连接字段。在 Hibernate 主配置文件中修改或添加如下信息:<property name="hbm2ddl.auto">create</property><mapping class="com.mk.po.Student" /><mapping class="com.mk.po.Course" />执行下面的测试实例:@Testpublic void testGetStuAndCourse() { HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>();}查看 MySql 中的表:切记把下面的信息修改回来:<property name="hbm2ddl.auto">update</property>手工添加测试数据:好!通过测试实例见证 Hibernate 的神奇。HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>();hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { Student stu=(Student)session.get(Student.class, new Integer(1)); System.out.println("---------------------------"); System.out.println("学生姓名:"+stu.getStuName()); System.out.println("----------------------------"); System.out.println("学生选修课程数:"+stu.getCourses().size()); return stu;}});查看控制台上面的输出结果:Hibernate: select student0_.stuId as stuId1_1_0_, student0_.stuName as stuName2_1_0_, student0_.stuPassword as stuPassw3_1_0_, student0_.stuPic as stuPic4_1_0_, student0_.stuSex as stuSex5_1_0_ from Student student0_ where student0_.stuId=?---------------------------学生姓名:Hibernate----------------------------Hibernate: select courses0_.stuId as stuId1_1_1_, courses0_.courseId as courseId2_2_1_, course1_.courseId as courseId1_0_0_, course1_.courseDesc as courseDe2_0_0_, course1_.courseName as courseNa3_0_0_ from score courses0_ inner join Course course1_ on courses0_.courseId=course1_.courseId where courses0_.stuId=?学生选修课程数:2Hibernate 构建了两条 SQL 语句,先是查询到学生信息,需要课程信息时,再通过中间表连接到课程表,查询出课程相关信息。可得出结论:默认情况下,Hibernate 使用了延迟加载。如此做,Hibernate 是考虑了性能的。
- 2.1 主键生成器 主键是关系数据库中的概念,目的是唯一标识表中记录,保证实体数据的完整性。关系数据库中表与表中数据的关系描述需依赖主键实现 ;另有外键概念,所谓外键是在另一张表中对引用表的主键值的引用称呼。主外键关系指在不同的表中通过共同的字段信息建立起表中数据依赖(引用)关系。回到 Hibernate 的世界!先展示一段代码:Student student = new Student(2, "Configuration老二", "男");session.save(student);上面的代码功能:把应用程序中的数据写入到数据库中,没毛病呀!来!没毛病找点毛病出来:实际操作时,要求 Hibernate 把程序中 stuId 属性的值插入到表中同名的 stuId 主键字段中。主键有什么特点?唯一性!回答得对。请问在应用程序中构建数据时,如何确保赋值给 stuId 的值在表中不存在!这就是问题所在。如何解决?使用 Hibernate 主键生成器。所谓主键生成器其作用就是在 Hibernate 向表中插入数据时,负责生成表中数据记录的主键。Hibernate 主键生成器 API 介绍:Hibernate 的主键生成器(generator)都实现了 org.hibernate.id.IdentityGenerator 接口; public class IdentityGenerator extends AbstractPostInsertGenerator { …… }开发者可以遵循这个接口规范提供自己的主键生成方案;Hibernate 内置有较多主键生成器,主键生成器都有自己的实现类,并提供有快捷名称方便在注解或 XML 中引用。常用主键生成器一览:org.hibernate.id.IncrementGenerator(increment):对 long、short 或 int 的数据列生成自动增长主键;org.hibernate.id.IdentityGenerator(identity): 适用于 SQL server,MySql 等支持自动增长列的数据库,适合 long、short 或 int 数据列类型;org.hibernate.id.SequenceGenerator(sequecne):适用 oracle,DB2 等支持 Sequence 的数据库,适合 long、short 或 int 数据列类型;org.hibernate.id.UUIDGenerator(uuid):对字符串列的数据采用 128 - 位 uuid 算法生成唯一的字符串主键;org.hibernate.id.Assigned(assigned):由应用程序指定,也是默认生成策略。默认使用 assigned 生成器。这种方案要求开发者在应用程序中提供自己的主键生成算法:调用保存方法之前,先带着指定的值往数据库中跑一趟,检索是否存在重复,如果有,再试其它值;调用保存方法之前,先检索到表中 stuId 字段值的最大值,返回应用程序后递增 1,用于 stuId 新值。如果多个用户同时向数据中插入数据,这种方案会出问题,不适合并发操作环境。使用 assigned 生成器除非有一个很完美的解决方案,否则建议只用于学习或测试环境。本课程使用的是 Mysql 数据库,最佳选择 identity 生成器,主键值交给数据库的自动增长列自动生成。
- 3. 实体类 实体类的作用是存储数据并提供对这些数据的访问。在我们这个项目中,实体类统一被放到了model包下,通常情况下,实体类中的属性与我们的数据表字段一一对应。当我们编写这些实体类的时候,建议对照着数据表的字段以防疏漏。
- 2.3 主键生成器 使用注解 @GeneratedValue 指定生成器类型后,Hibernate 一般情况下会自动创建对应的生成器对象,如前面指定类型为 IDENTITY,则创建生成 org.hibernate.id.IdentityGenerator 对象。如果需要个性化定制生成器对象,则需要显示指定生成器对象,如为 Oracle 数据库指定主键生成器时,则配置可如下:XML 映射方式:<id name="stuId" type="Integer" column="stuId"> <generator class="sequence"> <param name="sequence">mySeq</param> </generator></id>注解映射方式:@Id@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="mySeqIdGen")@SequenceGenerator(name="mySeqIdGen",sequenceName="mySeq")public Integer getStuId() { return stuId;}@SequenceGenerator 注解显示指明使用 org.hibernate.id.SequenceGenerator 生成器对象,并指定使用数据库中的命名为 mySeq 的序列化器。其它主键生成器的使用本文不再复述,抛砖引玉,学习者可自行深入!
- 2.2 使用主键生成器重构代码 在 Student 类的标识属性(stuId)上标注如下注解; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Integer getStuId() { return stuId; }简单得难以置信!空灵而干净!!使用 @GeneratedValue 注解确定主键生成器类型。GenerationType 是一个枚举类型,有如下几个选择:AUTO:Hibernate 区分数据库系统,自动选择最佳策略;IDENTITY: 适合具有自动增长类型的数据库,如 MySql……SEQUENCE: 适合如 Oracle 类型数据库;TABLE: 使用 Hibernate 提供的 TableGenerator 生成器,不常用。为了更好观察生成的新数据,重建数据库中的表。主配置文件中修改或添加如下配置信息; <property name="hbm2ddl.auto">create</property>执行插入数据实例; // 打开事务 try{ transaction = session.beginTransaction(); // 添加一条学生信息,此处没有指定学生编号 Student student = new Student("Hibernate 01", "男"); session.save(student); transaction.commit(); } catch(Exception e) { transaction.rollback(); } finally { session.close(); }进入 Mysql 系统查看,表结构中 stuId 自动设为主键,且为自动递增;查看表中数据,主键值自动生成;试着多加几条数据,别忘记修改如下配置信息。 <property name="hbm2ddl.auto">update</property>大功告成!!
- 3. Hibernate 的主配置文件 聊回到 Hibernate,Hibernate 是一个框架,框架只是一个半成品应用程序。需要使用 Hibernate 完成一次具体的数据库数据操作时,需要开发者的组件和 Hibernate 的组件通力合作。对于 Hibernate 来说,如何知道开发者具体使用什么样的数据库、什么样的持久化对象……开发者只需要把这些信息写入到配置文件中,Hibernate 就能通过读取配置信息了解开发者的心意。所以说主配置文件在 Hibernate 和 开发者之间充当了桥梁的作用,是内外交流的通道。Tips: 通过配置文件,在开发者和 Hibernate 之间进行信息传递,让 Hibernate 能从容面对不同开发者的需求。你有没有觉得 Hibernate 把开闭原则用得很好呢!知道了配置文件的作用,现在是时候了解 Hibernate 中的主配置文件能具体传递什么信息了。
hibernate生成实体类相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle