hibernate 组件映射小结

 类图:

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

 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值