Hibernate 继承关系映射——每个类一个数据表

时间:2020-12-02 12:21:41

                                 每个类一个数据表

这种方法父类和子类都要各自对应数据库中的一张表,并且子类和父类之间应用主键来设计他们的关联关系。


1、首先在Test数据库创建三张表

xs表

Hibernate 继承关系映射——每个类一个数据表

yjs表

Hibernate 继承关系映射——每个类一个数据表

bks表

Hibernate 继承关系映射——每个类一个数据表

2、添加Hibernate框架,建立POJO类


Hibernate 继承关系映射——每个类一个数据表

Xs.java


package org.vo;

/**
* Xs entity. @author MyEclipse Persistence Tools
*/

public class Xs implements java.io.Serializable {

// Fields

private Integer id;
private String xh;
private String xm;
private String bir;

// Constructors

/** default constructor */
public Xs() {
}

/** minimal constructor */
public Xs(String xh) {
this.xh = xh;
}

/** full constructor */
public Xs(String xh, String xm, String bir) {
this.xh = xh;
this.xm = xm;
this.bir = bir;
}

// Property accessors

public Integer getId() {
return this.id;
}

public void setId(Integer id) {
this.id = id;
}

public String getXh() {
return this.xh;
}

public void setXh(String xh) {
this.xh = xh;
}

public String getXm() {
return this.xm;
}

public void setXm(String xm) {
this.xm = xm;
}

public String getBir() {
return this.bir;
}

public void setBir(String bir) {
this.bir = bir;
}

}

Yjs.java


package org.vo;

/**
* Yjs entity. @author MyEclipse Persistence Tools
*/

public class Yjs extends Xs {

// Fields

private Integer xsId;
private String researchResult;

// Constructors

/** default constructor */
public Yjs() {
}

/** minimal constructor */
public Yjs(Integer xsId) {
this.xsId = xsId;
}

/** full constructor */
public Yjs(Integer xsId, String researchResult) {
this.xsId = xsId;
this.researchResult = researchResult;
}

// Property accessors

public Integer getXsId() {
return this.xsId;
}

public void setXsId(Integer xsId) {
this.xsId = xsId;
}

public String getResearchResult() {
return this.researchResult;
}

public void setResearchResult(String researchResult) {
this.researchResult = researchResult;
}

}

Bks.java


package org.vo;

public class Bks extends Xs {

// Fields

private Integer xsId;
private Boolean ky;

// Constructors

/** default constructor */
public Bks() {
}

/** minimal constructor */
public Bks(Integer xsId) {
this.xsId = xsId;
}

/** full constructor */
public Bks(Integer xsId, Boolean ky) {
this.xsId = xsId;
this.ky = ky;
}

// Property accessors

public Integer getXsId() {
return this.xsId;
}

public void setXsId(Integer xsId) {
this.xsId = xsId;
}

public Boolean getKy() {
return this.ky;
}

public void setKy(Boolean ky) {
this.ky = ky;
}

}


配置Xs.hbm.xml。另外最重要的是其余两个配置文件要将映射清空(不能删除),否则会产生一个实体进行多次映射  ,会有这种错误  org.hibernate.InvalidMappingException


<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.vo.Xs" table="xs" schema="dbo" catalog="Test">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="xh" type="java.lang.String">
<column name="xh" length="50" not-null="true" />
</property>
<property name="xm" type="java.lang.String">
<column name="xm" length="50" />
</property>
<property name="bir" type="java.lang.String">
<column name="bir" length="50" />
</property>
<joined-subclass name="org.vo.Yjs" table="yjs">
<key column="xsId"></key>
<property name="researchResult" column="researchResult" type="java.lang.String">
</property>
</joined-subclass>
<joined-subclass name="org.vo.Bks" table="bks">
<key column="xsId"></key>
<property name="ky" column="ky" type="java.lang.Boolean"></property>
</joined-subclass>

</class>
</hibernate-mapping>


Bks.hbm.xml


<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>

</hibernate-mapping>

3、测试类



package org.test;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.util.HibernateSessionFactory;
import org.vo.Bks;
import org.vo.Yjs;

public class Inheritance {
Session session=HibernateSessionFactory.getSession();
public static void main(String[] args){
Inheritance test=new Inheritance();
test.saveBks();
test.saveYjs();
test.query();
HibernateSessionFactory.closeSession();
}
public void saveYjs(){
Yjs yjs=new Yjs();
yjs.setXh("201401090122");
yjs.setXm("pengtao");
yjs.setResearchResult("5项研究成果");
yjs.setBir("1996-07-28");
Transaction ts=session.beginTransaction();
session.save(yjs);
ts.commit();
}
public void saveBks(){
Bks bks=new Bks();
bks.setXh("201501090122");
bks.setXm("tanyu");
bks.setKy(true);
bks.setBir("1998-01-14");
Transaction ts=session.beginTransaction();
session.save(bks);
ts.commit();
}
public void query(){
List list1=session.createQuery("from Yjs").list();
for(int i=0;i<list1.size();i++){
Yjs yjs=(Yjs)list1.get(i);
System.out.print(yjs.getXm()+"---->");
System.out.println(yjs.getResearchResult());
}
List list2=session.createQuery("from Bks").list();
for(int i=0;i<list2.size();i++){
Bks bks=(Bks)list2.get(i);
System.out.print(bks.getXm()+"---->");
System.out.println(bks.getKy());
}
}

}

运行结果

Hibernate 继承关系映射——每个类一个数据表