类图:
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">001052</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.isolation">2</property>
<!--mapping resource="basicCar/bean/BasicCar1.hbm.xml"/-->
<mapping resource="basicCar/bean/Account.hbm.xml"/>
<mapping resource="basicCar/bean/Customer.hbm.xml"/>
<mapping resource="basicCar/bean/Number.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Customer 类:
package basicCar.bean;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
public class Customer implements java.io.Serializable{
private long id_no;
private String name;
private String address;
private Set Accounts=new HashSet();//用于一对多存储多个账户时
private Number number;
public Customer() {
}
public Customer(long Id, String Name, String Address) {
this.id_no = Id;
this.name = Name;
this.address = Address;
}
public long getId_no() {
return this.id_no;
}
public void setId_no(long Id) {
this.id_no = Id;
}
public String getName() {
return this.name;
}
public void setName(String N) {
this.name = N;
}
public String getAddress() {
return this.address;
}
public void setAddress(String A) {
this.address = A;
}
public void setAccounts(Set A) {
this.Accounts = A;
}
public Set getAccounts() {
return this.Accounts;
}
public void setNumber(Number N){
this.number = N;
}
public Number getNumber() {
return this.number;
}
Customer 的.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>
<class name="basicCar.bean.Customer" table="customer" lazy="false">
<id column="id_no" name="id_no" type="long">
<!--<generator class="increment"></generator>要手动插入值就不能设置自动增长-->
</id>
<property name="name" column="name" type="string"></property>
<property name="address" column="address" type="string"></property>
<!-- 一对多,客户对账号-->
<set name="Accounts" inverse="true" cascade="delete">
<key column="customerId"/>
<one-to-many class="basicCar.bean.Account"/>
</set>
<!--
一对一,客户对号码
-->
<one-to-one
name="number"
class="basicCar.bean.Number"
cascade="delete"
></one-to-one>
</class>
</hibernate-mapping>
账号Account类:
package basicCar.bean;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Account implements java.io.Serializable {
private long id_a;
private long money;
private Timestamp opendate ;
Timestamp timeStamp;
// 乐观锁的vision
private int version;
private Customer customer;
public Account() {
}
public Account(long Money, Timestamp O, int V) {
this.money = Money;
this.opendate = O;
this.version = V;
}
public long getId_a() {
return this.id_a;
}
public void setId_a(long Id) {
this.id_a = Id;
}
public long getMoney() {
return this.money;
}
public void setMoney(long M) {
this.money = M;
}
public Date getOpendate() {
return this.opendate;
}
public void setOpendate(Timestamp O) {
this.opendate = O;
}
public Customer getCustomer() {
return this.customer;
}
public void setCustomer(Customer c) {
this.customer = c;
}
public int getVersion() {
return this.version;
}
public void setVersion(int V){
this.version=V;
}
}
另外的.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>
<class name="basicCar.bean.Account" table="account" lazy="false" dynamic-update="true" dynamic-insert="true" optimistic-lock="version">
<id name="id_a" column="id_a" type="long">
<generator class="increment"></generator>
</id>
<version column="version" name="version" type="int" />
<property name="money" column="money" type="long"></property>
<property name="opendate" column="opendate" type="java.util.Date"></property>
<!--
多对一,账号对用户
-->
<many-to-one name="customer"
column="customerId"
class="basicCar.bean.Customer"
cascade="save-update"
not-null="false">
</many-to-one>
</class>
</hibernate-mapping>
Number类:
package basicCar.bean;
public class Number implements java.io.Serializable{
private long nid; //号码ID号
private String homeNumber;//家庭电话
private String workNumber;//工作电话
private String mobileNumber;//手机号码
private String linkmanNumber;//联系人电话
private Customer customer;//一对一是用于获取对用户的操作
public Number(){
}
public Number(String H, String W, String M,String L){
this.homeNumber=H;
this.workNumber=W;
this.mobileNumber=M;
this.linkmanNumber=L;
}
public long getNid(){
return nid;
}
public void setNid(long N){
this.nid=N;
}
public String gethomeNumber(){
return homeNumber;
}
public void sethomeNumber(String H){
homeNumber=H;
}
public String getworkNumber(){
return workNumber;
}
public void setworkNumber(String W){
workNumber=W;
}
public String getmobileNumber(){
return mobileNumber;
}
public void setmobileNumber(String W){
mobileNumber=W;
}
public String getlinkmanNumber(){
return linkmanNumber;
}
public void setlinkmanNumber(String L){
linkmanNumber=L;
}
public Customer getCustomer(){
return customer;
}
public void setCustomer(Customer C){
customer=C;
}
}
Number的.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> <class name="basicCar.bean.Number" table="number" lazy="false"> <id name="nid" column="nid" type="long"> <generator class="foreign"> <param name="property">customer</param> </generator> </id> <property name="homeNumber" column="homeNumber" type="string"></property> <property name="workNumber" column="workNumber" type="string"></property> <property name="mobileNumber" column="mobileNumber" type="string"></property> <property name="linkmanNumber" column="linkmanNumber" type="string"></property> <!-- 已经在用户表设置了,这里再设置就是双向一对一 --> <one-to-one name="customer" class="basicCar.bean.Customer" constrained="true" cascade="save-update" ></one-to-one> </class></hibernate-mapping>
测试类Test.java:
package basicCar;
import java.awt.List;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.FlushMode;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import basicCar.bean.Account;
import basicCar.bean.Customer;
import basicCar.bean.Number;
public class Test {
Configuration cfg;
SessionFactory sf;
// Session session;
public static void main(String[] args) {
Test test = new Test();
test.DoConfiguration();
test.saveEntity();
//test.deleteEntity();
//test.updateEntity();
//更新成功在这里输出提示
test.queryEntity();
System.out.println("end");
}
void DoConfiguration() {
// new a configuration and read the configuration from the given path
cfg = new Configuration();
cfg.configure("/basicCar/hibernate.cfg.xml");
// use the properites in the configure file to new a sessionFactory
sf = cfg.buildSessionFactory();
}
void saveEntity() {
Session session;
session = sf.openSession();
// save a BasicCar in database
Transaction tx1 = session.beginTransaction();
Date time= new java.sql.Date(new java.util.Date().getTime());//获得系统时间.
String nowTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time);//将时间格式转换成符合Timestamp要求的格式.
Timestamp goodsC_date = Timestamp.valueOf(nowTime);//把时间转换
Account co1 = new Account(555,goodsC_date,1);
Account co2 = new Account(555,goodsC_date,1);
//测试用户与电话两个类的关系调用
Customer ss = new Customer(222,"man32","广州");
Number number1 = new Number("34234","","54545","345335");
//先保存ss,再保存、set number和co1的.
ss.getAccounts().add(co1);
ss.getAccounts().add(co2);
ss.setNumber(number1);
number1.setCustomer(ss);
co1.setCustomer(ss);
co2.setCustomer(ss);
//save先后顺序要先ss在co1
session.save(ss);
session.save(co1);
session.save(co2);
session.save(number1);
// System.out.println(bc1.getFactory());
tx1.commit();
// close session
session.close();
}
void deleteEntity() {
Session session;
// new a session from sessionfactory
session = sf.openSession();
//新建一个事务
Transaction tx3 = session.beginTransaction();
//准备批次删除
Query query=session.createQuery("from Customer");
java.util.List list = query.list();
System.out.println("银行用户:");
for (int i=0;i<list.size()-1; i++)
{
Customer customer = (Customer)list.get(i);
session.delete(customer);
//System.out.println(customer.getNumber().gethomeNumber());
}
//准备删除电话,观察对Customer的影响
/*Customer co2 = (Customer) session.load(Customer.class, new Long(211));
Number no1 = co2.getNumber();
session.delete(no1);*/
//成功!对Customer没影响
//测试删除customer对Number的影响
/*Customer co2 = (Customer) session.load(Customer.class, new Long(222));
session.delete(co2);*/
//成功!对Number有影响,会把Number也同时删除
try {
Account ao1 = (Account) session.load(Account.class, new Long(3));
Customer co1 = ao1.getCustomer();
Customer co2 = (Customer) session.load(Customer.class, new Long(144));
//如果address.hbm.xml有cascade="delete",那么可以连着把salesman也删除,否则只删除address
session.delete(co1);//删除账号后,用户和其它账号也被删除
Account ao2 = (Account) session.load(Account.class, new Long(3));
//删除ao2对该用户另一个账号没影响
session.delete(ao2);
} catch (Exception e) {
System.out.println("id=1 car are not existed, can't be deleted");
}
tx3.commit();
// close session*/
session.close();
}
void updateEntity() {
//测试乐观锁
/*Session session1=sf.openSession();
Session session2=sf.openSession();
Transaction tx1 = session1.beginTransaction();
Transaction tx2 = session2.beginTransaction();
try{
Account ao1 = (Account) session1.load(Account.class, new Long(28));
Account ao2 = (Account) session2.load(Account.class, new Long(28));
//这时候,两个版本号是相同的
ao1.setMoney(ao1.getMoney()+10);
tx1.commit();
//这时候,两个版本号是不相同的
ao2.setMoney(ao2.getMoney()+10);
tx2.commit();
System.out.println("OK!");
}catch(Exception e){
//System.out.println(e);
if(tx2 != null)//有同步数据库的作用
{
tx2.rollback();
updateEntity2();
}
else if(tx1 != null)//有同步数据库的作用
{
tx1.rollback();
updateEntity2();
}
}finally{
session1.close();
session2.close();
}*/
Session session;
// new a session from sessionfactory
// 把cid=7的order的salesman从原来的sid=15号,更新为14号
session = sf.openSession();
// update the name of besicCar above into database
Transaction tx2 = session.beginTransaction();
Customer co1 = (Customer) session.load(Customer.class, new Long(133));
//测试用户与电话两个类的关系调用
//下面三行代码是用来说明账号跟用户之间的引用关系的使用
Account ao1 = (Account) session.load(Account.class, new Long(12));
ao1.getCustomer().setName("Jack");
co1.setName("Amy");
session.update(co1);
// Salesman sas2 = (Salesman) session.load(Salesman.class, new Long(9));
// sas2.getSaddress().setCity("nanjing2");
// session.update(sas2);
tx2.commit();
// close session
session.close();
}
void queryEntity()
{
Session session;
// new a session from sessionfactory
session = sf.openSession();
// query a car from database
try{
Query query=session.createQuery("from Customer");
//某一行查询
/*Salesman bc3=(Salesman)query.list().get(0);
System.out.println("name for the first selected car is: "+bc3.getSid());*/
//多行查询
java.util.List list = query.list();
System.out.println("银行用户:");
for (int i=0;i<list.size(); i++)
{
Customer customer = (Customer)list.get(i);
System.out.print(customer.getId_no()+" ");
System.out.print(customer.getName()+" ");
System.out.print(customer.getAddress()+" ");
Number number1 = customer.getNumber();
if(number1!=null)
System.out.println(number1.getmobileNumber());
else
System.out.println("暂时没有电话");
}
System.out.println("-----------------");
System.out.println("银行用户的账户:");
Query query2=session.createQuery("from Account");
java.util.List list2 = query2.list();
for (int i=0;i<list2.size(); i++)
{
Account account = (Account)list2.get(i);
System.out.print(account.getId_a()+" ");
System.out.print(account.getMoney()+" ");
System.out.print(account.getCustomer().getId_no()+" ");
System.out.println(account.getOpendate()+" ");
}
System.out.println("-----------------");
System.out.println("用户的电话号码:");
Query query3=session.createQuery("from Number");
java.util.List list3 = query3.list();
for (int i=0;i<list3.size(); i++)
{
Number number = (Number)list3.get(i);
System.out.print("用户id:"+number.getCustomer().getId_no()+" ");
System.out.print("家庭电话:"+number.gethomeNumber()+" ");
System.out.print("工作电话:"+number.getworkNumber()+" ");
System.out.print("手机号码:"+number.getmobileNumber()+" ");
System.out.println("联系人电话:"+number.getlinkmanNumber()+" ");
}
}catch (Exception e) {
System.out.println(e);
}
// close session
session.close();
}
void updateEntity2() {
//测试乐观锁
Session session1=sf.openSession();
Transaction tx1 = session1.beginTransaction();
try{
Account ao1 = (Account) session1.load(Account.class, new Long(28));
//重新执行该事务
ao1.setMoney(ao1.getMoney()+10);
tx1.commit();
System.out.println("OK2!");
}catch(Exception e){
//System.out.println(e);
if(tx1 != null)//有同步数据库的作用
{
tx1.rollback();
updateEntity();
}
}finally{
session1.close();
}
}
}
输出结果:
银行用户:
200 man32 广州 54545
211 man32 广州 暂时没有电话
222 man32 广州 54545
-----------------
银行用户的账户:
27 655 200 2012-10-19 09:49:28.0
28 1335 200 2012-10-19 09:49:28.0
29 555 211 2012-10-19 10:10:48.0
30 555 211 2012-10-19 10:10:48.0
31 555 222 2012-10-22 19:33:45.0
32 555 222 2012-10-22 19:33:45.0
-----------------
用户的电话号码:
用户id:200 家庭电话:34234 工作电话: 手机号码:54545 联系人电话:345335
用户id:222 家庭电话:34234 工作电话: 手机号码:54545 联系人电话:345335
end