https://blog.csdn.net/huyuyang6688/article/details/50680899 我们都知道,Hibernate最大的一个优点就是使开发更加“面向对象...”,类与类之间有继承关系,Hibernate中也对这种继承关系提供了映射的封装。 ... 配置映射文件时,父类还用标签来定义即可;添加的区分字段(比如上面表1中的Type字段)需要用标签来定义;用标签定义两个子类,与父类“合并...(Animal.class, 1); System.out.println(pig.getName()); session.getTransaction().commit(); 执行结果都为: 小猪猪...().commit(); 总结 这种映射方式可以把多个类放在一张表中,但是粒度比较粗,有冗余字段;但又是因为多个类的相关记录都存放在一张表中,查询时不用关联,因此效率较高。
现实中有很多场景需要用到多对一或者一对多,比如上面这两个类图所展现出来的,一般情况下,一个部门会有多名员工,一名员工只在一个部门任职。...> 映射文件中的内容基本上跟它关联的类中的字段都是对应的。...主键配置在中,基本字段配置在中,对其他类的引用配置在中。 ...().commit(); 一执行,发现报错了:org.hibernate.TransientObjectException,一看错误就知道,这是因为department还在Transient状态时...()){ System.out.print(" "+employee.getName()); } session.getTransaction().commit(); 控制台输出内容为:
的值为 subselect 时,注意:该属性的值,在一次加载多个客户的订单数据的情况下才有效 // 结果:会在使用集合(订单)时才加载,子查询语句,如果你使用集合只是为了获取集合的长度,则Hibernate...法二:因为是在Service层调用的Dao层的方法,那么我们在Service层就知道以后我们在页面上要用的数据,所以我们在Seesion关闭之前,在Service层先getXxx()在页面要上要用到的属性...与SQL语法基本一致,不同的是HQL是面向对象的查询,查询的是对象和对象中的属性。 HQL的关键字不区分大小写,但是类名和属性名区分大小写。...乐观锁(需要自己实现,但Hibernate帮我们实现了,我们只需配置一下就可以使用了): 乐观锁:丢失更新肯定不会发生。 在表中提供一个字段(版本字段),用于标识记录。如果版本不一致,不允许操作。...().commit(); session.close(); } } 乐观锁示例代码: 在PO对象(JavaBean)中提供字段,表示版本字段。
值,将ID值加1作为新的主键,不建议使用,存在线程并发问题 // assigned => 需要手动指定主键,不手动指定将会报错 session.getTransaction...// 持久化状态的特点:Hibernate会自动将持久化状态对象的变化同步到数据库中。 ...session.update(u); // 多余代码 => 因为Hibernate会自动将持久化状态对象的变化同步(更新)到数据库中。 ...Session一级缓存中,但是为什么每次调用Hql查询都会生成Sql语句呢?...多对多:提供中间表(从表),提供2个字段(外键)分别对应两个主表。 一对一:非常少见。 如何使用面向对象的思想通过代码描述对象与对象之间关系?
建立实体类 配置好SessionFactory之后,我们就可以开始建立一对一的单表映射了。首先需要建立一个实体类,这里Getter、Setter、toString、equals等方法省略了。...默认情况下表名和实体类名相同,如果希望自定义表名使用Table注解并设置相应的name属性。 Id注解标明了主键。...NaturalId指定实体类的自然主键。一般情况下推荐使用无意义的数字作为主键,但是有时候类似于用户名、书籍编号这样的属性也具有主键的意义。这时候我们将这些属性定义为自然主键。...注解即可以放在字段上,也可以放在方法上。如果放在字段上,Hibernate就会使用字段对数据进行操作。如果放在方法上,Hibernate就使用方法操作数据。...不论哪种都是可以的,但是需要注意保持一致性,不能混用。Hibernate检索的依据是Id注解的位置,如果Id放在了方法上而其他注解放在了字段上,Hibernate就会忽略字段上的所有注解,反之亦然。
此时,我们需要使用 Hibernate 的高级特性,如 HQL(Hibernate Query Language)、Criteria API 以及原生 SQL 查询。3.1....每当数据发生变化时,版本号会自动增加。...Hibernate 提供了不同的策略来实现继承映射,如 SINGLE_TABLE、JOINED 和 TABLE_PER_CLASS。...自定义类型映射在某些情况下,Java 类的字段类型可能不适合直接映射到数据库字段。这时可以通过自定义类型映射来解决问题。...通过合理的使用 Hibernate 的特性,如分页查询、批量操作、多表继承、自定义类型映射等,可以显著提升系统性能,满足企业级应用的需求。
().commit(); session.close(); 控制台打印: ----------------- Hibernate: insert into t_user (...-----"); session.getTransaction().commit(); System.out.println("-------------------"); 控制台打印: -...().commit(); System.out.println("-------------------"); 控制台打印: Hibernate: select user0_....情况1)调用save方法把临时状态变为持久状态 情况2)调用save方法把游离托管状态状态变为持久对象 保存一个对象之后,提交事务/关闭Session,此时对象处于游离状态, 再创建新的Session...session中的方法仅仅是改变对象的状态,不发SQL: 3: 持久化对象的属性真正发生改变时,才会发生UPDAE语句. ---- 发生SQL的时机: 默认情况下,在事务提交时,会自动去数据库同步这一次对象变化对应的
-- 20 1:每次在创建sessionFactory时执行创建表,当调用sessionFactory的close方法的时候,删除表 21 #hibernate.hbm2ddl.auto... table集合属性要映射的表 key指定集合表(t_addressList)的外键字段 element指定集合表的其他字段...19 key指定集合表(t_address)的外键字段 20 element指定集合表的其他字段 21...(); 57 //session.getTransaction().commit();这样写就不用使用事务tx接受了,更加方便快捷 58 session.close(...()); 118 119 session.getTransaction().commit(); 120 session.close(); 121
" column="student_id"> hibernate-mapping> 配置文件中的set对应于相应类中的集合...().commit(); 插入结果: ?...().commit(); 查询结果: Hibernate: select course0_.id as id2_0_, course0_.name as name2_0_ from t_course...().commit(); 查询结果 Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_ from t_student...可以用两个一对多关系来实现,即可以手动将中间表设计成一个实体,并为其配置映射关系,所以通常情况下,一个多对多关系也可以用两个一对多关系来实现。
一般情况下,我们只会用到前两种情况,多对多用的较少。我这里使用省市区三级联查来实现级联的操作。简单来说,一对多就是一个省下面有多个市,一个市下面有多个县。多对一是刚好反过来的。...首先是使用配置文件的情况下,关联类,生成的hbm.xml文件中显示如下: hibernate-mapping> <class name="com.qy.domain.Province" table...-- name:当前类的属性名 column:从表中的外键名 foreign-key:主表中的被参照字段 property-ref:主表中被参照字段的属性名...注意: (1):如果实体类属性名与表字段名不一致的时候,要么都注解在属性前,要么都注解在get方法前。不能部分注解在属性前,部分注解在方法前。...(2):如果实体类属性名与表字段名一致的时候,可以部分注解在属性前,部分注解在方法前。 (3):如果在实体类中某些属性不注解:(属性和get都不写注解),默认为表字段名与实体类属性名一致。
-- 映射普通字段 父类的属性直接引用就行了,比如name属性,直接写就行了!...(); session.save(cat); //如果取数据时候Animal父类接收的话,需要给出Anmail的全名 //提交事务 transaction.commit();...鉴别器字段:作用是在数据库中区别每一个子类的信息, 就是一个列 discriminator-value="cat_" 指定鉴别器字段,即type_字段的值 如果不指定,默认为当前子类的全名 --...-- Animal下的子类映射成一张表 指定子类的类型,对应的表 指定子类的外键字段【需要对应Animal】 指定子类的普通属性 --> <joined-subclass name="Cat...-- 将子类的信息都映射成一张表 给出属性的名称 属性对应的数据库表 普通字段 --> <property
就打算让用户自己配置要加入的字段,然后生成相应的表。 须要动态配置的部分实例: 上图仅仅是一小部分,一个一个组合起来大概有三百多。每一项相应一个实体,显然不好,就算是依照规律归归类还是有不少。...后来决定用Hibernate的动态模型来处理这个问题,可能有的人不是非常了解Hibernate的动态模型,以下我们就来介绍一下。 我们通经常使用实体类来跟表进行映射。...String password; // setter、getter... } 然后用配置文件或注解来描写叙述映射关系,假设使用动态模型的话,则不须要编写实体类,仅仅须要写一个配置文件就可以...().commit(); session.close(); 发出的SQL语句:insert into User (name, password) values (?...就是为了兼容执行期生成的动态模型配置文件,而JRebel能够检測到配置文件的变化,从而将新增的配置载入进来。
一般它和JavaBean对象放在同一目录下 我们是不知道该XML是怎么写的,可以搜索一下Hibernate文件夹中后缀为.hbm.xml。看看它们是怎么写的。然后复制一份过来 ? 这里写图片描述 的,不设置主键,数据库怎么知道你要更新什么。...当调用sesisonFactory的close方法的时候,删除表!...常用的属性: name 指定对象的属性名称 column 指定对象属性对应的表的字段名称 如果不写默认与对象属性一致。...length 指定字符的长度, 默认为255 type 指定映射表的字段的类型,如果不指定会匹配属性的类型 **java类型: 必须写全名【例:java.lang.String】 ** **
private String username; private String password; private Set address; //各种setter和getter...) 对应的数据表的外键字段(dept_id) 集合中的元素类型(Employee)【通过这个类型,Hibernate就可以找到对应类型的映射文件,从而得到对应的信息!】...) 中间表另外的外键字段(developer_id) Project和Developer的映射文件都需要这几个关键步骤 Project映射文件 的表,要把字段映射成外键,用的是manyToOne--> <!...-- 外键的属性name是user 对应表的字段是userId 属性的类型是User 该字段需要唯一性 unique
所以不是我自己去学习的,现在我自己学习了一下,然后我在完善一下Hibernate。 Hibernate的作者是Gavin King。...不存在的,我也不知道的,简单绘个小图吧 ?...这个Jar包的org.hibernate包里面包含着约束文件,如两图所示 ?...-- 类到表的映射,属性到字段的映射 --> commit(); } catch (Exception e) { // TODO Auto-generated catch block //事务回滚 session.getTransaction
-- set集合属性的映射 name 指定要映射的set集合的属性 table 集合属性要映射到的表 key 指定集合表(t_address)的外键字段 element 指定集合表的其他字段 type...().commit(); session.close(); } 问题: 集合映射,映射的集合元素,都是普通的类型, 能否为对象类型?...session.save(emp_zs); session.save(emp_ls);// 再保存多的一方,关系回自动维护(映射配置完) session.getTransaction().commit...cascade 属性 cascade 表示级联操作 【可以设置到一的一方或多的一方】 none 不级联操作, 默认值 save-update 级联保存或更新 delete...映射的集合属性: “developers” 2. 集合属性,对应的中间表: “t_relation” 3. 外键字段: prjId 4. 外键字段,对应的中间表字段: did 5.
Po对象: IdCard .java public class IdCard { private int id; private String cardNo; //getter...public class Person { private int id; private String name; private IdCard idCard; //getter...person=new Person(); person.setName("danny"); person.setIdCard(idCard); session.save(person); session.getTransaction...().commit(); 由于t_person生成策略为native,跟t_idcard无关,所以在第四行代码中先执行了session.save(idCard),目的是把idCard变为变为transient...> 因为这里配置的实质是一张身份证只对应一位公民,所以用标签,property-ref="idCard"指t_idcard的主键与t_person中的idCard字段对应
一般它和JavaBean对象放在同一目录下 我们是不知道该XML是怎么写的,可以搜索一下Hibernate文件夹中后缀为.hbm.xml。看看它们是怎么写的。然后复制一份过来 的信息 configure方法 configure()方法用于加载配置文件 加载主配置文件的方法 如果指定参数,那么加载参数的路径配置文件 如果不指定参数,默认加载src/目录下的...我们来使用一下update()方法吧....既然是更新操作了,那么肯定需要设置主键的,不设置主键,数据库怎么知道你要更新什么。...SQL:Struct query language 结构化查询语言 查询的是表以及列【不区分大小写】 HQL是面向对象的查询语言,可以用来查询全部的数据!...@Column(name="c_name", length=30, nullable=true) private String name; 注意:对于PO类中所有属性,如果你不写注解,默认情况下也会在表中生成对应的列
().commit(); } } 运行结果: log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment...(); 代码,即:不处理集合对象。...但是我们会发现 第二条select语句,对于我们的需求是没有必要的,他只有一个用处就是占用我们的程序执行时间。当然, 这是我们不希望看到的结果。...一般情况下,Hibernate会默认给我们设置延迟加载。...lazy="true" ,这样会提升我们的系统性能,所以一般情况下,我们不会去 设置lazy="false",当然在特殊的情况下,我们必须要取消延迟加载的时候,我们就把lazy="false",就可以了
领取专属 10元无门槛券
手把手带您无忧上云