hibernate实现继承

1.hibernate中子类继承的表实现
 三种策略:
 一个表:优点......需要多态,子类属性比较少的时候实用.
        缺点......有空字段.需要标志位.
 二张表:优点......没有多态时候,操作针对单表,不需要映射查询的时候很实用.简单易用.
        缺点......父类信息在子类分别体现,浪费.修改父类的时候子类信息所这被修改.
 三张表:优点......充分体现多态,修改的时候只需要修改一个表不需要修改其他的表. 
        缺点......复杂查询慢,维护难.
        一个类写一张表,需要多态,并且子类属性较多的时候实用.
2.三个类.
3.配置文件
  一种策略针对一个配置文件
  一张表:
   一个类里面有子类;每个子类后面需要标志位,来说明是那个子类.<subcalss/>
  二张表:
   父类信息在每一张表内.
   配置文件一个类.<union-class/>
  三张表:
   要关联的,用外键.
   配置文件一个类.<joined-subclass/>
                  一个额外的ID.
4.业务.
5.Hibernate的sql语句.
  select  from 类全名 别名 where 别名.类属性=:变量名
  updata  类全名 set 类属性=:变量名 where 属性名=:变量名
6.hibernate里的标签学习
  <set name="" inverse=""|控制权限
               cascade=""级联
                       -|none
                       -|save-updata
                       -|delete
                       -|all
                       -|persist
                       -|......                      
7.hibernate里面的隔离级别.
  1  读未提交的数据
  2  读已提交的数据
  4  可重复读
  8  可串行化
 <property name="hibernate.connection.isolation">1|2|4|8</property>
 引起的原因:并发事务
 解决的方法:加锁
            -|读锁
            -|         
           hibernate悲观锁,认为别人一定来读.行锁,表锁-效率低.
                    乐观锁,认为别人不会来读.-|加时间戳,检查来修改的人的时间戳是否一样,如果还没有释放则不让改.
                                                也有问题.                     
                                            -|默认字段,比较安全......        
8.下面看继承在hibernate里面的实现
在这例子里面实用的是建立三张表,这样对应三个类
实现基本的对对象操作作用到数据库的数据上.
在业务上有弊端,应注意.
  -|.1.首先建数据库
create database bank;
create table payment(
pid int primary key AUTO_INCREMENT,
name char(32) not null,
amount double not null
);
create table cardpayment(
currency char(16) not null,
pid int primary key,
constraint k foreign key(pid)  references payment(pid)
);
create table cashpayment(
pid int primary key,
bank varchar(32) not null,
owner varchar(64) not null,
constraint kk foreign key(pid) references payment(pid)
);
    -|.2.写出三个类
父类Payment.java
package com;
public class Payment {
   private int pid;
   private String name;
   private double amount;
   private CardPayment cardP;
   private CashPayment cashP;
public CardPayment getCardP() {
 return cardP;
}
public void setCardP(CardPayment cardP) {
 this.cardP = cardP;
}
public CashPayment getCashP() {
 return cashP;
}
public void setCashP(CashPayment cashP) {
 this.cashP = cashP;
}
public Payment(int pid, String name, double amount) {
 super();
 this.pid = pid;
 this.name = name;
 this.amount = amount;
}
public Payment() {
 super();

}
public double getAmount() {
 return amount;
}
public void setAmount(double amount) {
 this.amount = amount;
}
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public int getPid() {
 return pid;
}
public void setPid(int pid) {
 this.pid = pid;
}
}
子类CardPayment.java
package com;
public class CardPayment extends Payment {
   private int pid;
   private String currency;
   private Payment p;
public Payment getP() {
 return p;
}
public void setP(Payment p) {
 this.p = p;
}
public String getCurrency() {
 return currency;
}
public void setCurrency(String currency) {
 this.currency = currency;
}
public int getPid() {
 return pid;
}
public void setPid(int pid) {
 this.pid = pid;
}
public CardPayment() {
   super();
}
public CardPayment(int pid, String currency) {
 super();
 this.pid = pid;
 this.currency = currency;
}
}
子类CashPayment.java
package com;
public class CashPayment extends Payment{
  private int pid;
  private String bank;
  private String owner;
public CashPayment() {
 super();
}
public CashPayment(int id, String bank, String owner) {
 super();
 this.pid = id;
 this.bank = bank;
 this.owner = owner;
}
public String getBank() {
 return bank;
}
public void setBank(String bank) {
 this.bank = bank;
}
public int getPid() {
 return pid;
}
public void setPid(int pid) {
 this.pid = pid;
}
public String getOwner() {
 return owner;
}
public void setOwner(String owner) {
 this.owner = owner;
}
}
   -|.3.几个实用类
Util.java
package util;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public  class Util {
 static Configuration cfg=new Configuration().configure();
 static SessionFactory sf=cfg.buildSessionFactory();
 public static Session config(){
   
    Session s=sf.openSession();
    return s;
   }
  /* public static void clear(){
    sf.close();     
   }*/ 
}
一个接口
package util;
public interface UtilADO {
    public boolean insertCardPayment();//实现在卡上输入钱,在数据库里显示
    public boolean insertCashPayment();//实现在存着上输入钱,在数据库里显示
    public void query();//查询所有的内容
}
主要实现类
package util;
import java.util.*;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.*;
public class ManageUtilADO implements UtilADO{
 public boolean insertCardPayment() {
 /* Session s=Util.config();
  Transaction tr=s.beginTransaction();
  CardPayment cardP=new CardPayment();
  //CashPanyment cashP=new CashPanyment();
  cardP.setName("yutao");
  cardP.setAmount(10000);
  cardP.setCurrency("123");
  //p.setCardP(cardP);
   
  try {
   s.save(cardP);  
   tr.commit();
   return true;
  } catch (HibernateException e) {
   e.printStackTrace();
   return false;
  }*/
  return true;
  
 }
 public boolean insertCashPayment() {
  /*Session s=Util.config();
  Transaction tr=s.beginTransaction();
  //CardPanyment cardP=new CardPanyment();
  CashPayment cashP=new CashPayment();
  cashP.setName("yu");
  cashP.setAmount(10000);
  cashP.setBank("People");
  cashP.setOwner("tao");
  
  try {
   s.save(cashP);  
   tr.commit();
   return true;
  } catch (HibernateException e) {
   e.printStackTrace();
   return false;
  }*/
  return true;
 }
 public void query() {//查询出一张表的所有内容,相当与查询一个类里面的所有对象映射数据
  Session s=Util.config();
  Transaction tr=s.beginTransaction();
  Query q=s.createQuery("from Payment");
  Iterator i = q.list().iterator();
  System.out.println("打印出总表信息");
  System.out.println("ID" + "/t" + "Name" + "/t" + "Amount");
  while(i.hasNext()){
   Payment p = (Payment)i.next();
   System.out.println(""+ p.getPid() + "/t"
     + p.getName() + "/t"
     + p.getAmount() + "/t"
     );
  }
  tr.commit();
 }
 public void quaryCard(){  
  Session s=Util.config();
  Transaction tr=s.beginTransaction();
  Query cardP=s.createQuery("from CardPayment");
    Iterator i=cardP.list().iterator();
    System.out.println("打印出card信息");
    System.out.println("PID"+"/t"+"name"+"/t"+"amount"+"/t"+"current");
    while(i.hasNext()){
     CardPayment cp=(CardPayment)i.next();
          System.out.println(""+ cp.getPid() + "/t"
      + cp.getName() + "/t"
      + cp.getAmount() + "/t"
      +cp.getCurrency()
      );
    }
    tr.commit();
  }
 public void quaryCard(String name){  
  Session s=Util.config();
  Transaction tr=s.beginTransaction();
  Query cardP=s.createQuery("from CardPayment cp where cp.name='"+name+"'");
    Iterator i=cardP.list().iterator();
    System.out.println("按条件查询打印出card信息");
    System.out.println("PID"+"/t"+"name"+"/t"+"amount"+"/t"+"current");
    while(i.hasNext()){
     CardPayment cp=(CardPayment)i.next();
          System.out.println(""+ cp.getPid() + "/t"
      + cp.getName() + "/t"
      + cp.getAmount() + "/t"
      +cp.getCurrency()
      );
    }
    tr.commit();
  }
}
   -|.4.main函数类
package cn;
import util.*;
public class Manage {
    public static void main(String[] args) {
  boolean b;
  ManageUtilADO m=new ManageUtilADO();
  b=m.insertCardPayment();
  if(b){
   System.out.println("成功");
  }else{
   System.out.println("失败");
  }//实现对子类card的操作,及插入数据,同时实现了对父类的操作,把相关数据插入到父类对应的表里面
  ManageUtilADO m1=new ManageUtilADO();
  b=m1.insertCashPayment();
  if(b){
   System.out.println("成功");
  }else{
   System.out.println("失败");
  }
  //m.query();
  m.quaryCard();
  m.quaryCard("yutao");
}  
}
 -|.5.配置文件
<?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">
 <class name="Payment" table="PAYMENT">
  <id name="pid" unsaved-value="null">
   <generator class="native">
     <!--<param name="table">pk_table</param>
     <param name="column">id_value</param>
    --></generator>
  </id>
  <property name="name"></property>
  <property name="amount"></property>
  <joined-subclass name="CardPayment" table="CARDPAYMENT">
   <key column="pid"/>
   <property name="currency"></property>
  </joined-subclass>
  <joined-subclass name="CashPayment" table="CASHPAYMENT">
   <key column="pid"/>
   <property name="owner"/>
   <property name="bank"></property>
  </joined-subclass>
  
 </class>
</hibernate-mapping>
............................
         注意
............................
写这些的目的是要今后用到时不会找不到参考.
以上代码均能够实现,希望今后再看的时候感觉不同.
.......yu........
    一张表策略
create table payment_hierarchy(
 id int primary key,
 name varchar(32) not null,
 amount double not null,
 currency varchar(16),
 owner varchar(64),
 bank varchar(32),
 payment_type varchar(16)
);                                             
关键在这里配置文件:
<?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="inheritance">
 <class name="Payment" table="PAYMENT_HIERARCHY">
  <id name="id" unsaved-value="null">
   <generator class="hilo">
     <param name="table">pk_table</param>
     <param name="column">id_value</param>
    </generator>
  </id>
  <discriminator column="payment_type" type="string"></discriminator>
  <property name="name"></property>
  <property name="amount"></property>
  <subclass name="CashPayment" discriminator-value="cash">
   <property name="currency"></property>
  </subclass>
  <subclass name="CardPayment" discriminator-value="card">
   <property name="owner"/>
   <property name="bank"></property>
  </subclass>
 </class>
 <query name="queryWithParam"><![CDATA[from Payment cp where cp.amount > :ma]]></query>
</hibernate-mapping>   
.........yu.........
两张表策略
create table cashpayment_concrete(
 id int primary key,
 name varchar(32) not null,
 amount double not null,
 currency varchar(16)
);
create table cardpayment_concrete(
 id int primary key,
 name varchar(32) not null,
 amount double not null,
 bank varchar(32) not null,
 owner varchar(64) not null
);     
关键在这里.
<?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="inheritance">
 <class name="Payment">
  <id name="id" unsaved-value="null">
   <generator class="hilo">
     <param name="table">pk_table</param>
     <param name="column">id_value</param>
    </generator>
  </id>
  <property name="name"></property>
  <property name="amount"></property>
  <union-subclass name="CashPayment" table="CASHPAYMENT_CONCRETE">
   <property name="currency"></property>
  </union-subclass>
  <union-subclass name="CardPayment" table="CARDPAYMENT_CONCRETE">
   <property name="owner"></property>
   <property name="bank"></property>
  </union-subclass>
 </class>
</hibernate-mapping>                                          
                                             
                                             
                                           
                                         

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值