w1100n
This site is best viewed in Google Chrome
5/21/2015 13:59 | Tag:, ,

http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/ Table of Contents 1. Overview 2. The JPA Spring Configuration with Java 3. The JPA Spring Configuration with XML 4. Going full XML-less 5. The Maven configuration 6. Conclusion 1. Overview This is tutorial shows how to set up … Continue reading

5/21/2015 9:58 | Tag:

hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下: <properties> <property name=”hibernate.show_sql” value=”true” /> <property name=”hibernate.hbm2ddl.auto” value=”create” /> </properties> Hibernate Reference Documentation 3.3.1解释如下: Automatically validate or export schema DDL to the database when the SessionFactory is created. With create-drop, the database schema will be dropped when the … Continue reading

5/20/2015 17:04 | Tag:

http://blog.csdn.net/chaijunkun/article/details/8442406 本文出处:http://blog.csdn.net/chaijunkun/article/details/8442406,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。 昨天晚上遇到一个需求,每天早上要生成一份报告给各个部门的Leader。实现方式基本上确定为HTML格式的电子邮件。但是数据方面犯了难。原因在于数据库中存储的数据是跨表的,而且还要做count统计,这样得到的结果就不是原生的MySQL表,我用的又是JPA技术。我们知道,使用JPA第一步就是映射实体,每一张表就至少对应一个实体(力求严谨,因为联合主键时一张表会对应两个对象)。可是对于灵活的查询尤其是连接查询,并不存在一个真正的表与其对应,怎么样才能解决呢?来,我们来举个“栗子” 假设我们有两张表,一张学院表,一张学生表。学院表里存着学院ID和学院名称,学生表里存着学生的基本信息,包括学号、学院ID和学生姓名(其它较复杂的属性我们不看了),正如下面的建表语句所示:   view plaincopy — —————————- — Table structure for `depts` — —————————- DROP TABLE IF EXISTS `depts`; CREATE TABLE `depts` ( `deptId` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘学院ID’, `deptName` varchar(50) NOT NULL COMMENT ‘学院名称’, PRIMARY KEY (`deptId`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; — —————————- — Records of depts — —————————- INSERT INTO `depts` VALUES (‘1’, ‘哲学院’); INSERT INTO `depts` VALUES (‘2’, ‘经济学院’); INSERT INTO `depts` VALUES (‘3’, ‘法学院’); INSERT INTO `depts` VALUES (‘4’, ‘教育学院’); INSERT INTO `depts` VALUES (‘5’, ‘文学院’); INSERT INTO `depts` VALUES (‘6’, ‘历史学院’); INSERT INTO `depts` VALUES (‘7’, ‘理学院’); INSERT INTO `depts` VALUES (‘8’, ‘工学院’); INSERT INTO `depts` VALUES (‘9’, ‘农学院’); INSERT INTO `depts` VALUES (’10’, ‘医学院’); INSERT INTO `depts` VALUES (’11’, ‘军事学院’); INSERT INTO `depts` VALUES (’12’, ‘管理学院’); INSERT INTO `depts` VALUES (’13’, ‘艺术学院’); 再建立一个学生表,再随便往里面插入点数据:   view plaincopy — —————————- — Table structure for `students` — —————————- DROP TABLE IF EXISTS `students`; … Continue reading

5/29/2014 6:24 | Tag:,

hibernate annotation 之 主键生成策略 Posted on 2012-10-12 20:10 fancydeepin 阅读(2993) 评论(1) 编辑 收藏 所属分类: Hibernate Annotation Hibernate 默认总共支持 13 种生成策略 : 1. increment 2. identity 3. sequence 4. hilo 5. seqhilo 6. uuid 7. uuid.hex 8. guid 9. native 10. … Continue reading

5/29/2014 1:47 | Tag:,

http://www.cnblogs.com/seed_lee/archive/2011/02/14/1954720.html hibernate的ID生成策略(annotation方式@GeneratedValue) 记录hibernate中使用annotation的方式实现主键生成策略: 一般情况下,hibernate中使用annotation的主键生成策略,都是使用annotation的标准注解(javax.persistence.GeneratedValue),而不是使用hibernate的扩展的annotation方式,当然,使用也是没有错的,推荐使用标准的annotation。 标准的annotation方式的主键生成策略如下: AUTO – 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库. TABLE – 使用表保存id值(也就是会为应用的表创建一张专门保存Id的表,记录对应的表的对应最大的ID值,如下图) CPU7@71(TD68TSQ(FD@D}MM IDENTITY – identity column SEQUENCE – sequence 下面的例子展示了使用SEQ_STORE配置的sequence生成器 @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”SEQ_STORE”) public Integer getId() { … } 下面这个例子使用的是identity生成器 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Long getId() { … } AUTO生成器适用于可移植的应用(在多个DB间切换). … Continue reading

5/29/2014 1:07 | Tag:

http://blog.csdn.net/huayu815/article/details/6860596 缓存可以简单的看成一个 Map ,通过 key 在缓存里面找 value 。 一、缓存简介 Cache In Hibernate HIBERNATE 中的 CACHE 有两级 . 一级是在 Session 范围内的 CACHE . 即每个 Session 有自己的一个 CACHE, 当前操作的对象都会被保留在 CACHE 中 . 但是 Session 关闭后这个 CACHE 也就没有 . 可见这级 CACHE 的生命期是很短的 . … Continue reading

11/27/2012 22:14 | Tag:

  hibernate锁机制包括悲观锁和乐观锁 1.悲观锁:     它指的是对数据被外界修改持保守态度。假定任何时刻存取数据时,都可能有另一个客户也正在 存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数 据库提供的锁机制来实现。     基于jdbc实现的数据库加锁如下:     select * from account where name=”Erica” for update.在更新的过程中,数据库处于加锁状 态,任何其他的针对本条数据的操作都将被延迟。本次事务提交后解锁。     而hibernate悲观锁的具体实现如下:     String sql=”查询语句”;     Query query=session.createQuery(sql);     query.setLockMode(“对象”,LockModel.UPGRADE);     说到这里,就提到了hiernate的加锁模式:     LockMode.NONE : 无锁机制。     LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动获取。     LockMode.READ … Continue reading

3/27/2012 14:24 | Tag:

Annotations 是为域对象指定一个不变约束的便利而优雅的途径.例如通过它,你可以表示一个属性不应该是Null值,账户余额绝对不能是负值,等等。这些域模型的约束通过注释它的属性声明在bean自身。验证器可以读取这些注释并检查约束违反性。验证机制可以在没有重复这些规则的情况下在应用程序的不同层里执行(表示层,数据访问层).Hibernate验证器在遵循DRY规则的情况下设计. Hibernate 验证器工作在两个级别。首先,它能检测位于内存的类实例的约束违反性.其次,它可以把约束应用在hibernate的元模型中并且把它们应用在生成的数据库中. 每一个约束注释都与一个为检查实体实例而实现的验证器对应关联。一个验证器也可以可选的应用约束到hibernate元模型,允许hibernate生成DDL来表达这些约束。利用合适的事件监听器,你可以通过hibernate在插入或更新的时候检查约束性。Hibernate验证器没有限定在必须配合hibernate执行验证。你也可以容易的把它用在其他java的持久化提供者上面(实现了实体监听器). 在运行期检查实例时,hibernate验证器把有关违反验证的信息放在一个InvalidValue类型的数组里返回.在其他信息中,InvalidValue所包含的错误描述消息可以嵌入参数值和注释绑定,并且消息字符串可以以资源文件的形式提供. 第一章 定义约束 1.1 什么是约束 约束是一个给定的元素(可以使field,property,或bean)所必须遵循的规则.规则的语义可以由注释表达。约束通常有一些属性用来参数化约束限制。这些约束应用到被注释的元素。 1.2 内建约束 与Hibernate 验证器一起内建了一些约束,他们已经覆盖了大多数基本的数据检查,当然我们后来会看到,你不一定使用它们,你可以在一分钟内写出你自己的约束。 @Length(min=, max=) property (字符串) 检查是字符串长度范围 列长度被设置到最大 @Max(value=) property (数字,或代表数字的字符串) 检查值是否=或min 在列上添加一个约束 @NotNull property 是否null 列不为null @NotEmpty property 字符串不空或非NULl 链接不空或非null 对字符列非null约束 @Past property (date 或 calendar) … Continue reading

12/30/2011 3:53 | Tag:

Hibernate DetachedCriteria,这是一个非常有意义的特性!我们知道,在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询。 针对这种需求,对于分层应用程序来说,Web层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表之后,然后依次取出条件,构造查询语句。这里的一个难点是条件列表用什么来构造?传统上使用Map,但是这种方式缺陷很大,Map可以传递的信息非常有限,只能传递name和value,无法传递究竟要做怎样的条件运算,究竟是大于,小于,like,还是其它的什么,业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必须相应修改,但是这种查询条件的改变是隐式约定的,而不是程序代码约束的,因此非常容易出错。 DetachedCriteria可以解决这个问题,即在web层,程序员使用DetachedCriteria来构造查询条件,然后将这个DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。就此,查询语句的构造完全被搬离到web层实现,而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美!这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧! 示例代码片段如下: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.add(Restrictions.eq(“name”, “department”)). createAlias(“employees”, “e”).add(Restrictions.gt((“e.age”), new Integer(20))); Department和Employee是一对多关联,查询条件为:名称是“department”开发部门;部门里面的雇员年龄大于20岁; 业务层对象使用该条件执行查询: detachedCriteria.getExecutableCriteria(session).list(); 最大的意义在于,业务层代码是固定不变的,所有查询条件的构造都在web层完成,业务层只负责在session内执行之。这样代码就可放之四海而皆准,都无须修改了。然而Spring和Hibernate DetachedCriteria有不兼容的问题,因此在Spring环境下面使用Hibernate3需要注意: Spring的HibernateTemplate提供了Hibernate的完美封装,即通过匿名类实现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是: HibernateTemplate.execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { …. } } 回调方法提供了session作为参数,有了session,就可以自由的使用Hibernate API编程了。使用了spring的之后,代码修改如下: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.createAlias(“employees”, “e”). add(Restrictions.eq(“name”, “department”)). add(Restrictions.gt((“e.age”), new Integer(20))); departmentManager.findByCriteria(detachedCriteria);

12/30/2011 3:20 | Tag:

saveOrUpdateCopy,merge和update区别 首先说明merge是用来代替saveOrUpdateCopy的,然后比较update和merge,update的作用上边说了,这里说一下merge的,如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例,如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例,最后返回该持久实例,用户给出的这个对象没有被关联到session上,它依旧是脱管的。重点是最后一句: 当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态,但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,Hibernate或者new了一个B,或者检索到,一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。 flush和update区别 这两个的区别好理解update操作的是在脱管状态的对象,而flush是操作的在持久状态的对象。 默认情况下,一个持久状态的对象是不需要update的,只要你更改了对象的值,等待Hibernate flush就自动保存到数据库了。Hibernate flush发生再几种情况下: 1,调用某些查询的时候 2,transaction commit的时候 3,手动调用flush的时候 lock和update区别 1.update是把一个已经更改过的脱管状态的对象变成持久状态 2.lock是把一个没有更改过的脱管状态的对象变成持久状态 对应更改一个记录的内容,两个的操作不同: 1.update的操作步骤是:更改脱管的对象->调用update 2.lock的操作步骤是:调用lock把对象从脱管状态变成持久状态——>更改持久状态的对象的内容——>等待flush或者手动flush

辽ICP备14012896