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>