Hibernate
陈夏明
联系邮箱:xiaming_chen@163.com
展开
-
hibernate——*.hbm.xml文件映射关系配置
在使用hibernate时,经常需要配置与类对应的hbm.xml文件,并在其中指明数据库表的具体细节。 由于映射关系的配置比较繁琐,故总结了模板代码如下:多对一:<many-to-one name="本类中的属性名" class="对方类" column="本类中的属性名+Id"></many-to-one>一对多:<set name="本类中的属性名"><key column="多的那一方中引原创 2015-10-17 15:49:38 · 2773 阅读 · 1 评论 -
Hibernate&MySQL——Group是关键字,在使用Hibernate时不能将其作为表名
在写程序时,由于需要用到“分组”类,故随手写了Group作为类名(坑!)。在之后使用Hibernate自动建表时,报错:Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Unable to execute schema management to JDBC target [create table Group (i原创 2016-02-23 18:44:13 · 1597 阅读 · 0 评论 -
Hibernate——报错:org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass
在使用Hibernate时,出现了如下错误:Caused by: java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass错误原因在于: 在父类中定义并配置了主键之后,又在子类中重复定义并配置了主键。结果方法: 删除子类中主原创 2016-02-23 17:53:39 · 3333 阅读 · 2 评论 -
Hibernate——org.hibernate.StaleStateException: Batch update returned unexpected row count from update
在使用hibernate更新数据库记录的信息时,出现org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 错误。原因分析: 我在更新数据时,显式地使用了id的setId()方法为其指定值。但是我的实原创 2015-12-26 12:11:00 · 14428 阅读 · 0 评论 -
Hibernate——update-只更新被修改的字段
方法一:(不好,因为不灵活) 使用注解: 在不希望被更新的字段对应的属性的getXXX()方法上注解:@Column(updatable=false) 使用XML: 在不希望被更新的字段对应的属性的xxx.hbm.xml配置文件中设置:<property name="xxx" update="false"/>方法二:只更新所修改的字段原创 2015-11-18 11:07:12 · 1872 阅读 · 0 评论 -
Hibernate——session缓存
当使用session.get()或session.load()时,取出来的对象会缓存在session的缓存中,当下次再需要取的时候,则不会执行SQL语句,直接从缓存中取出。当使用session.get()或session.load()时,会首先在缓存中查找,若缓存中没有,才会去数据库中查找。要清空session的缓存,可以使用session.clear()方法session.flush()方法:强制原创 2015-11-18 11:08:16 · 271 阅读 · 0 评论 -
Hibernate——自动建表
方法一:在hibernate.cfg.xml文件中设置:<property name="hbm2ddl.auto">update</property>方法二:new SchemaExport(new AnnotationConfiguration().config()).create(boolean, boolean);其中: create方法的两个参数分别为: 第一个参原创 2015-11-18 11:01:59 · 418 阅读 · 0 评论 -
Hibernate——对象的三种状态
transient: 内存中的一个对象,没ID,session缓存与数据库中都没有该对象 persistent:内存、session缓存、数据库中均有该对象,切有ID detached:内存中有,session缓存中没有, 数据库中有该对象session.save()方法可以将对象从transient状态变为persistent状态。原创 2015-11-18 11:05:16 · 255 阅读 · 0 评论 -
Hibernate——openSession()与getCurrentSession()的区别
openSession(): ·永远打开新的Session ·需要手写session.close()getCurrentSession(): ·若当前环境(上下文)中有Session(即Session没commit之前),则会取当前上下文中的Session,否则创建一个新的Session 用途:界定事务边界 ·事务提交自动执行close()上下文: 在hibernate.原创 2015-11-18 11:04:16 · 266 阅读 · 0 评论 -
Hibernate——get()与load()
通过get()获取对象时,会马上执行SQL语句,并返回所查询的对象。通过load()获取对象时,会返回一个代理对象,此时上它没有执行SQL语句,而是在需要获取该对象的属性时(真正用到对象的属性时)才会执行SQL语句。原创 2015-11-18 11:06:11 · 286 阅读 · 0 评论 -
Hibernate——事务
事务:要么同时完成,要么同时都不完成。事务的特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)脏读:读了另一个事务没有提交的数据 不可重复读:在同一个事务中,对同一个数据读两次的结果不同 幻读:一个事务在读的过程中,有另一个事务执行了插入或删除数据,影响了读的结果数据库的事务隔离级别: ·read-unco原创 2015-11-22 15:10:25 · 403 阅读 · 0 评论 -
Hibernate——1+N问题
1+N问题: 问题描述: 在关联关系为1:N和N:1时,每取一个对象,若fetch = FetchType.EGER,则会取出所有与其关联的其他对象 故本应该只执行一条SQL语句,结果却是执行了N条解决方案: (1)设置fetch = FetchType.LAZY (2)在类上设置@BatchSize(size=每一次取的个数) (3)使用join原创 2015-11-22 11:46:37 · 269 阅读 · 0 评论 -
Hibernate——缓存
·什么是缓存: 内存中开辟的一块空间,把本来应该存储在硬盘中的东西放入该空间,以后需要时直接从该空间读取,这部分内存就叫缓存·什么是一级缓存: session级别的缓存 在同一个session中,每取一个新对象,则会将其放在session缓存中,等到下次再使用该对象时,则直接从session缓存中取出 缺点:多线程情况下,每个线程都是一个不同的session,原创 2015-11-22 11:51:46 · 346 阅读 · 0 评论 -
Hibernate——list()与iterate()
session.createQuery("from User").list();session.createQuery("from User").iterate();区别: ·在生成list或interator时,list会将每个对象全部取出,而iterate仅仅取出每个对象的id(主键),等需要用到该对象时,再去取出整个对象。·在同一个session中,每次生成list时,都会发SQL语句,并原创 2015-11-22 11:47:47 · 308 阅读 · 0 评论 -
Hibernate——Annotation
·在实体类上注解@Entity(javax.persistence.Entity) ·在主键的getXXX()方法上注解@Id ·在hibernate.cfg.xml文件中配置:<mapping class="实体类的全名" />若使用Annotation的方式配置关系,则只需使用new Configuration().configure().buildSessionFactory();而不需要原创 2015-11-20 16:36:28 · 296 阅读 · 0 评论 -
Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition
在使用了Spring提供的OpenSessionInViewFilter来在一个请求中保持hibernate的session推迟关闭后,会出现如下报错:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEV原创 2016-02-25 16:46:56 · 4880 阅读 · 0 评论