- 浏览: 1229796 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
本示例演示Hibernate继承映射的第一种策略:每棵类继承树对应一张表 1、理解如何映射 因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。 这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。用hibernate实现这种策略的时候,有如下步骤: 父类用普通的<class>标签定义 在父类中定义一个discriminator,即指定这个区分的字段的名称和类型 如:<discriminator column=”XXX” type=”string”/> 子类使用<subclass>标签定义,在定义subclass的时候,需要注意如下几点: Subclass标签的name属性是子类的全路径名 在Subclass标签中,用discriminator-value属性来标明本子类的discriminator字段(用来区分不同类的字段)的值 Subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),也可以与class标签平行。 当subclass标签的定义与class标签平行的时候,需要在subclass标签中,添加extends属性,里面的值是父类的全路径名称。 子类的其它属性,像普通类一样,定义在subclass标签的内部。 2、理解如何存储 在存储数据的时候,hibernate会自动将鉴别字段的值插入到数据库中,在加载数据的时候, hibernate便能根据这个鉴别字段正确的加载对象 3、理解何为多态查询,即hibernate能够加载数据的时候自动鉴别其真正的类型 多态get(),支持 多态load(),设置Lazy=“false”时,支持 多态查询,支持
配置如下:
测试的话先在mysql下创建数据库hibernate.再配置好下列文件放在src根目录
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">sys833199</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">True</property> <property name="format_sql">True</property> <property name="use_sql_comments">True</property> <mapping resource="com/lwf/hibernate/extend1/ext1.hbm.xml"/> </session-factory> </hibernate-configuration>
log4j.properties
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file hibernate.log ### #log4j.appender.file=org.apache.log4j.FileAppender #log4j.appender.file.File=hibernate.log #log4j.appender.file.layout=org.apache.log4j.PatternLayout #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=warn, stdout #log4j.logger.org.hibernate=info #log4j.logger.org.hibernate=debug ### log HQL query parser activity #log4j.logger.org.hibernate.hql.ast.AST=debug ### log just the SQL #log4j.logger.org.hibernate.SQL=debug ### log JDBC bind parameters ### log4j.logger.org.hibernate.type=info #log4j.logger.org.hibernate.type=debug ### log schema export/update ### log4j.logger.org.hibernate.tool.hbm2ddl=debug ### log HQL parse trees #log4j.logger.org.hibernate.hql=debug ### log cache activity ### #log4j.logger.org.hibernate.cache=debug ### log transaction activity #log4j.logger.org.hibernate.transaction=debug ### log JDBC resource acquisition #log4j.logger.org.hibernate.jdbc=debug ### enable the following line if you want to track down connection ### ### leakages when using DriverManagerConnectionProvider ### #log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
ext1.hbm.xml
这里配置按照继承映射第一种策略进行,即父类与子类映射到同一个表中,表中有一个字段来标识属于哪一个子类.
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.lwf.hibernate.extend1"> <class name="Animal" table="t_animal"> <id name="id"> <generator class="native"></generator> </id> <discriminator column="type" type="string"/> <property name="name"/> <property name="sex"/> <subclass name="Bird" discriminator-value="bird"> <property name="height"/> </subclass> <subclass name="Pig" discriminator-value="pig"> <property name="weight"/> </subclass> </class> </hibernate-mapping>
Animal类
package com.lwf.hibernate.extend1; public class Animal { private int id; private String name; private boolean sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } }
package com.lwf.hibernate.extend1; public class Bird extends Animal { private int height; public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } }
package com.lwf.hibernate.extend1; public class Pig extends Animal { private int weight; public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } }
上面文件建立好后,使用ExportDB类创建表.
package com.lwf.hibernate.util; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ExportDB { public static void main(String[] args) { //读取配置文件 Configuration cfg = new Configuration().configure(); //创建SchemaExport对象 SchemaExport export = new SchemaExport(cfg); //创建数据库表 export.create(true,true); } }
建立工具类:
package com.lwf.hibernate.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory factory; private HibernateUtils() {} static { Configuration cfg = new Configuration().configure(); factory = cfg.buildSessionFactory(); } public static SessionFactory getSessionFactory() { return factory; } public static Session getSession() { return factory.openSession(); } public static void closeSession(Session session) { if (session != null) { if (session.isOpen()) { session.close(); } } } }
以下是我的测试类:
package com.lwf.hibernate.test; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import com.lwf.hibernate.extend1.Animal; import com.lwf.hibernate.extend1.Bird; import com.lwf.hibernate.extend1.Pig; import com.lwf.hibernate.util.HibernateUtils; public class Ext1Test { public static void main(String[] args) { // testSaveAnimal(); // testLoad1(); // testLoad2(); testLoad3(); testLoad4(); // testLoad5(); // testLoad6(); } /** * 保存数据 * */ public static void testSaveAnimal() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Pig p = new Pig(); p.setName("猪1"); p.setSex(true); p.setWeight(400); Bird b = new Bird(); b.setName("孔雀"); b.setSex(true); b.setHeight(100); session.save(p); session.save(b); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 通过Pig类来装载 * */ public static void testLoad1() { Session session = null; try { session = HibernateUtils.getSession(); Pig p = (Pig)session.load(Pig.class, 1); System.out.println("name=" + p.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 通过Animal类来装载 * */ public static void testLoad2() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.load(Animal.class, 1); System.out.println("name=" + a.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public static void testLoad3() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.load(Animal.class, 1); //因为我们load默认是Lazy,因为Lazy所以我们看到的是Animal的代理类 //所以通过instance是具体反映不出真正的对象类型的 if (a instanceof Pig) { System.out.println("name=" + a.getName()); }else { System.out.println("不是猪!"); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public static void testLoad4() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.get(Animal.class, 1); //可以正确判断,因为Animal不是代理类 if (a instanceof Pig) { System.out.println("name=" + a.getName()); }else { System.out.println("不是猪!"); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 将Animal的lazy设置为false * */ public static void testLoad5() { Session session = null; try { session = HibernateUtils.getSession(); Animal a = (Animal)session.load(Animal.class, 1); if (a instanceof Pig) { System.out.println("name=" + a.getName()); }else { System.out.println("不是猪!"); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public static void testLoad6() { Session session = null; try { session = HibernateUtils.getSession(); /** * 多态查询 */ List animalList = session.createQuery("from com.lwf.hibernate.extend1.Animal").list(); for (Iterator iter = animalList.iterator(); iter.hasNext(); ) { Animal a = (Animal)iter.next(); System.out.println("name=" + a.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } }
要通过对每一个测试方法的运行才能将最开始的描述有更深的认识.
上面测试类中testLoad3与testLoad4比较得知: 多态get(),支持
testLoad3与testLoad5比较得知:多态load(),设置Lazy=“false”时,支持
- hibernate_ext1.rar (13.6 KB)
- 下载次数: 11
- lib_need.rar (9.8 MB)
- 下载次数: 7
发表评论
-
Hibernate抓取策略二
2010-05-11 17:56 1070在Classes与Student一对多映射中,我们将Set里面 ... -
Hibernate抓取策略一
2010-05-11 16:29 1315抓取策略指多表关联查询的时候,Hibernate会发出多条sq ... -
Hibernate查询缓存
2010-05-11 01:15 1611二级缓存中,如果不设置“查询缓存”,那么hibernate只会 ... -
Hibernate所需完整类库
2010-05-11 01:08 884附件为最新配置Hibernate所需的包. 由来: 一、下 ... -
Hibernate 二级缓存缺少包出现的异常
2010-05-10 23:29 2325由于二级缓存使用的包org.hibernate.cache.E ... -
转:Hibernate性能优化之二级缓存
2010-05-10 17:28 1132http://chenhongbin007.blog.163. ... -
Hibernate lazy加载FOR 单端关联
2010-05-10 00:54 1309Hibernate单端关联懒加载策略:即在<one-to ... -
Hibernate lazy加载FOR Connection
2010-05-10 00:28 1185Hibernate集合属性的懒加载策略: 在集合属性上, ... -
Hibernate lazy加载FOR Class
2010-05-09 23:51 1040lazy策略可以用在: * <class>标签 ... -
Hibernate性能优化:二级缓存
2010-05-06 16:48 1060hibernate二级缓存 定义步骤: 1、打开缓存, ... -
Hibernate性能优化:一级缓存
2010-05-06 16:33 1114一级缓存与session周期一致,二级缓存与sessionFa ... -
Hibernate悲观锁与乐观锁及事务管理机制
2010-05-06 11:57 1180引用: 悲观锁与乐观锁: http://www.iteye ... -
Hibernate学习笔记博客
2010-05-06 11:32 716网上也有人自学hibernate的笔记 http://hi. ... -
Hibernate与EJB的区别
2010-05-05 18:09 865Hibernate不支持分布式应用 -
Hibernate对象状态
2010-05-05 17:48 1767Hibernate对象有三种状态: 瞬时状态(Transie ... -
Hibernate HQL示例十二:DML更新、删除及与Hibernate持久化更新
2010-05-05 16:42 1962DML更新及删除 示例: package com.bjsx ... -
Hibernate HQL示例十一:分页查询
2010-05-05 16:21 1128分页查询: select * from t_student ... -
Hibernate HQL示例十:统计查询
2010-05-05 15:57 2108统计函数的使用 count(*) 等 package co ... -
Hibernate HQL示例九:连接查询
2010-05-05 15:38 3533inner join left out join rig ... -
Hibernate HQL示例八:查询对象导航及Implicit Join
2010-05-05 10:32 1680通过Student对象导航到class对象的id 如下: ...
相关推荐
4. 分层继承:与表 per 类类似,每个类都有自己的表,但只有实体类有自己的表,抽象类不对应任何表。这适用于抽象类中没有字段的情况。 C3P0是另一个重要的知识点,它是开源的JDBC连接池,用于管理数据库连接。连接...
10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 在某些情况下,开发者可以选择在继承层次的不同部分使用不同的映射策略,然后通过隐式多态来实现整个层次的多态性。但Hibernate不支持在同一阶级元素...
- **9.1.1 每个类分层结构一张表 (Table per class hierarchy)**:描述每个类分层结构一张表策略。 - **9.1.2 每个子类一张表 (Table per subclass)**:介绍每个子类一张表策略。 - **9.1.3 每个子类一张表 ...
继承映射是Hibernate提供的一种处理类继承关系的技术,它允许我们将一个类的继承结构映射到数据库的表结构中。在Java中,类的继承可以表现为单继承或多继承,而在关系数据库中,表的关联通常通过外键实现,这与类的...
混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射...
9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...
10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 10.1.5. 每个具体类一张表(Table per concrete class) 10.1.6. Table per concrete class, using implicit polymorphism 10.1.7. 隐式多态和其他...
- **示例**:以创建一个简单的新闻条目为例,首先定义一个`News.java`类,然后使用Hibernate进行数据的持久化操作。这个过程中,Hibernate会自动处理数据与数据库表之间的映射,极大地简化了开发过程。 #### 四、...
9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...
9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...
12.1 继承关系树的每个具体类对应一个表 12.1.1 创建映射文件 12.1.2 操纵持久化对象 12.2 继承关系树的根类对应一个表 12.2.1 创建映射文件 12.2.2 操纵持久化对象 12.3 继承关系树的每个类对应一个...
9. Hibernate支持什么类型的继承映射策略? Hibernate支持单表继承、联合继承(也称作表集约化)和分层继承三种策略。 10. Hibernate事务管理如何操作? Hibernate支持JTA(Java Transaction API)和JDBC事务管理...
9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...
9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射...
9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射...
10.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 10.1.5. 每个具体类一张表(Table per concrete class) 10.1.6. Table per concrete class, using implicit polymorphism 10.1.7. 隐式多态和其他...
9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承...
- **关系模型**:实体通过表描述,每行代表一个实体实例,每列代表实体的一个属性。 - **面向对象**:包括封装、继承和多态等特性,用于构建复杂的应用程序结构。 - **ORM的意义**:减少数据访问层的重复代码,提高...