Heim > Datenbank > MySQL-Tutorial > Hibernate关联关系映射之继承映射

Hibernate关联关系映射之继承映射

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-07 16:03:42
Original
1268 Leute haben es durchsucht

首先有一个文章类(Article)类中有id、title、content、postTime等属性。 package entity;import java.util.Date;public class Article {private Integer id;private String title;private String content;private Date postTime;public Integer getId() {r

首先有一个文章类(Article)类中有id、title、content、postTime等属性。

package entity;
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;
	}	
}
Nach dem Login kopieren

然后看他的子类,Topic类和Reply类。他们除了父类的属性外还有自己独特的属性。

package entity;

public class Topic extends Article{
	private int type;
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
}
Nach dem Login kopieren
package entity;

public class Reply extends Article{
	private int floor;

	public int getFloor() {
		return floor;
	}

	public void setFloor(int floor) {
		this.floor = floor;
	}
	
}
Nach dem Login kopieren

继承映射的方式有三种方式,我们一个个看:

方式一:将父类和子类的信息存放在同一个表中,然后在该数据表中有个字段用来表示该条记录的类型,其中子类独有的属性允许为空。我们看一下映射配置文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="entity">
    <class name="entity.Article" table="article" schema="MYHR" discriminator-value="Article">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        
        <!-- 用于鉴别是什么类型的一个列 -->
        <discriminator type="string" column="t_class"/>
        <property name="title"/>
        <property name="content" type="clob" length="5000"/>
        <property name="postTime" type="timestamp"/>
        <subclass name="Topic" discriminator-value="Topic">
            <property name="type" type="int"/>
        </subclass>
        <subclass name="Reply" discriminator-value="Reply">
            <property name="floor" type="int"/>
        </subclass>
    </class>
</hibernate-mapping>
Nach dem Login kopieren

方式二:父类和子类不在同一张表中,且每一个类一张表,抽象类对应一张表,这是配置子类使用joined-subclass

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="entity">
	<class name="entity.Article" table="article" schema="MYHR">
		<id name="id" type="int">
			<column name="ID" />
			<generator class="assigned" />
		</id>
		<property name="title" />
		<property name="content" type="clob" length="5000" />
		<property name="postTime" type="timestamp" />

		<joined-subclass name="Topic" table="topic">
			<key column="id" />
			<property name="type" type="int" />
		</joined-subclass>
		<joined-subclass name="Reply" table="reply">
			<key column="id" />
			<property name="floor" type="int" />
		</joined-subclass>
	</class>
</hibernate-mapping>
Nach dem Login kopieren

方式三:每一个类单独一张表,并且抽象类不对应一张表,子类对应的数据库表中对应全部的属性,包括从父类继承的信息。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="entity">
    <!-- 采用每个具体类一张表,抽象类不对应表,abstract默认为false,设为true表示为抽象的不对应表 -->
	<class name="entity.Article" abstract="true" schema="MYHR">
		<id name="id" type="int">
			<column name="ID" />
			<generator class="assigned" />
		</id>
		<property name="title" />
		<property name="content" type="clob" length="5000" />
		<property name="postTime" type="timestamp" />

		<union-subclass name="Topic" table="topic">
			<property name="type" type="int" />
		</union-subclass>
		<union-subclass name="Reply" table="reply">
			<property name="floor" type="int" />
		</union-subclass>
	</class>
</hibernate-mapping>
Nach dem Login kopieren

然后看一下测试类,三种方式测试类相同,只有方式三的save方法中因为抽象类没有单独的数据表因此不能存储他们父类的信息。

package test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Article;
import entity.Reply;
import entity.Topic;
import factory.HibernateSessionFactory;

public class Test {

	private Session session = null;
	private Transaction tran = null;
	@org.junit.Test
	public void save() {
		session = HibernateSessionFactory.getSession();
		tran = session.beginTransaction();
		try{
			Article article = new Article();
			article.setId(1);
			article.setTitle("这是一个Article");
			
			Topic topic = new Topic();
			topic.setId(2);
			topic.setTitle("这是一个Topic");
			
			Reply reply = new Reply();
			reply.setId(3);
			reply.setTitle("这是一个reply");
			
			session.save(article);
			session.save(topic);
			session.save(reply);
			
			tran.commit();
		}catch(Exception e){
			tran.rollback();
		}
	}

	@org.junit.Test
	public void Get() {
		session = HibernateSessionFactory.getSession();
		tran = session.beginTransaction();
		try{
			Article a = (Article)session.get(Article.class, 1);
			Topic t = (Topic)session.get(Topic.class, 2);
			Reply r = (Reply)session.get(Reply.class, 3);
			
			System.out.println(a.getTitle());
			System.out.println(t.getTitle());
			System.out.println(r.getTitle());
			tran.commit();
		}catch(Exception e){
			tran.rollback();
		}
	}
}
Nach dem Login kopieren


Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage