Hibernate(十)继承结构映射
2015-07-19 20:44
232 查看
Hibernate中继承结构映射有三种实现方式:
使用一张表(映射文件名与超类相同)
每个类一张表(抽象类也对应表。每个表中只有当前类中的属性)
每个具体类对应一张表(抽象类不对应表。每个表中都有全部的信息,包括继承过来的信息)
这里以论坛帖子和回复为例。
整个继承结构使用一张表(每个列不可以有not null约束)
超类
article
每个类一张表
Article.hbm.xml
article2
reply2
topic2
每个具体类对应一张表
article3
reply3
topic3
使用一张表(映射文件名与超类相同)
每个类一张表(抽象类也对应表。每个表中只有当前类中的属性)
每个具体类对应一张表(抽象类不对应表。每个表中都有全部的信息,包括继承过来的信息)
这里以论坛帖子和回复为例。
整个继承结构使用一张表(每个列不可以有not null约束)
超类
package test.hibernate.hbmExtends; import java.util.Date; public class Article { private Integer id; private String title; private String content; private Date postTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getPostTime() { return postTime; } public void setPostTime(Date postTime) { this.postTime = postTime; } }
package test.hibernate.hbmExtends; public class Topic extends Article{ private int type;//精华、置顶 public int getType() { return type; } public void setType(int type) { this.type = type; } }
package test.hibernate.hbmExtends; public class Reply extends Article{ private int floor; public int getFloor() { return floor; } public void setFloor(int floor) { this.floor = floor; } }这里只有一个配置文件Article.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="test.hibernate.hbmExtends"> <!-- discriminator-value属性:用于鉴别是哪个类的一个值,表示这 个值就是这个类。 如果不写,默认为类的全限定名。 --> <class name="Article" table="article" discriminator-value="Article"> <id name="id" type="integer" column="id"> <generator class="native" /> </id> <discriminator type="string" column="class_"></discriminator> <property name="title" /> <property name="content" /> <property name="postTime" type="timestamp" /> <subclass name="Topic" discriminator-value="Topic"> <property name="type"></property> </subclass> <subclass name="Reply" discriminator-value="Reply"> <property name="floor"></property> </subclass> </class> </hibernate-mapping>
package test.hibernate.hbmExtends; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.Test; public class App { private static SessionFactory sessionFactory = new Configuration()// .configure()// .addClass(Article.class)// 添加Hibernate实体类(加载对应的映射文件) .buildSessionFactory(); @Test public void testSave() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // 构建对象 Article article = new Article(); article.setTitle("这是一篇文章"); Topic topic = new Topic(); topic.setTitle("这是一张帖子"); Reply reply = new Reply(); reply.setTitle("这是一张回复"); // 保存 session.save(article); session.save(topic); session.save(reply); // -------------------------------------------- session.getTransaction().commit(); session.close(); } @Test public void testGet() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // 获取数据 // Article article=(Article) session.get(Article.class, 1); // Topic topic=(Topic) session.get(Topic.class, 2); // Reply reply=(Reply) session.get(Reply.class, 3); Article article = (Article) session.get(Article.class, 1); Article topic = (Article) session.get(Article.class, 2); Article reply = (Article) session.get(Article.class, 3); System.out.println(article); System.out.println(topic); System.out.println(reply); session.getTransaction().commit(); session.close(); } }表结构
article
每个类一张表
Article.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="test.hibernate.hbmExtends2"> <!-- 采用每个类一张表的方式,抽象类也对应表 --> <class name="Article" table="article2"> <id name="id" type="integer" column="id"> <generator class="native" /> </id> <property name="title" /> <property name="content" /> <property name="postTime" type="timestamp" /> <!-- 定义子类Topic --> <joined-subclass name="Topic" table="topic2"> <key column="id"></key> <property name="type"></property> </joined-subclass> <!-- 定义子类Reply --> <joined-subclass name="Reply" table="reply2"> <key column="id"></key> <property name="floor"></property> </joined-subclass> </class> </hibernate-mapping>
package test.hibernate.hbmExtends2; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.Test; public class App { private static SessionFactory sessionFactory = new Configuration()// .configure()// .addClass(Article.class)// 添加Hibernate实体类(加载对应的映射文件) .buildSessionFactory(); @Test public void testSave() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // -------------------------------------------- // 构建对象 Article article = new Article(); article.setTitle("这是一篇文章"); Topic topic = new Topic(); topic.setTitle("这是一张帖子"); Reply reply = new Reply(); reply.setTitle("这是一张回复"); // 保存 session.save(article); session.save(topic); session.save(reply); // -------------------------------------------- session.getTransaction().commit(); session.close(); } @Test public void testGet() throws Exception { Session session = sessionFactory.openSession(); session.beginTransaction(); // 获取数据 // Article article=(Article) session.get(Article.class, 1); // Topic topic=(Topic) session.get(Topic.class, 2); // Reply reply=(Reply) session.get(Reply.class, 3); Article article = (Article) session.get(Article.class, 1); Article topic = (Article) session.get(Article.class, 2); Article reply = (Article) session.get(Article.class, 3); System.out.println(article); System.out.println(topic); System.out.println(reply); session.getTransaction().commit(); session.close(); } }
article2
reply2
topic2
每个具体类对应一张表
<?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="test.hibernate.hbmExtends3"> <!-- 采用每个具体类一张表的形式,抽象类不对应表。 abstract默认为false,设为true表示本类不对应表 (类可以不是abstract的), 这时就会忽略table属性 --> <class name="Article" abstract="false" table="article3"> <id name="id"> <!-- 这里native生成策略不能用 --> <!-- 使用每个具体类一张表的方式时,主键生成策略不能是identity。因为在整个 继承结构中,主键值是不能重复的。 --> <generator class="hilo"> <param name="table">hi_value</param> <param name="column">next_value</param> <param name="max_lo">5</param> </generator> </id> <property name="title" /> <property name="content" /> <property name="postTime" type="timestamp" /> <!-- 子类Topic --> <union-subclass name="Topic" table="topic3"> <property name="type"></property> </union-subclass> <!-- 子类Reply --> <union-subclass name="Reply" table="reply3"> <property name="floor"></property> </union-subclass> </class> </hibernate-mapping>
article3
reply3
topic3
相关文章推荐
- XMPP常用开源服务器介绍
- codeforces 552E Vanya and Brackets(暴力)
- 并查集
- pygame初步(一)绘制一个运动的矩形
- PL/SQL(x64)借助Oracle Instant Client连接Oracle配置教程
- 垃圾收集基础
- leetcode 110 Balanced Binary Tree
- 正则表达式
- leetcode 110 Balanced Binary Tree
- WebService笔记(第二弹:使用JAX-WS开发WebService)
- NOI2015 day1 prog 程序自动分析(并查集)
- 三次握手和四次挥手的小结
- 是机会而不是威胁
- java web 开发中hibernate常见的基础问题
- AC自动机 - 关于Fail指针
- 键盘事件
- ZOJ 3233
- UI界面 view的常用属性
- FTP服务器无法访问原因
- mybatis使用初步问题解决方案