hibernate初级 对象-关系映射基础

学习精通Hibernate java对象持久化第4章联系如下:

customer 实体类

package mypack;
import java.io.Serializable;
import java.util.Set;
import java.util.*;
public class Customer implements Serializable
{
 private Long id;
 private String firstname;
 private String lastname;
 private char sex;
 private Set orders=new HashSet();
 private double avgPrice;
 private double totalPrice;
 private String description; 

 //应用程序无法给Id来赋值,而hibernate却可以 
 private void setId(Long id)
 {
  this.id=id;
 }
 public Long getId()
 {
  return this.id;
 }
 // hibernate在下面是靠调用get和set方法来给属性赋值的,所以此处应该为setName
 public void setName(String name)
 {
  StringTokenizer t=new StringTokenizer(name);
  firstname=t.nextToken();
  lastname=t.nextToken();
 }
 public String getName()
 {
  return this.firstname+" "+this.lastname;
 }
 /*
 * 下面这两组get和set方法是供应用程序来调用的
  当应用程序给属性持久化的时候分别调用setFirstname和setLastname,
  给这个javabean赋上值,而hibernate持久化的时候调用的是getName这样
  就把应用程序所赋的值给持久化
 */
 public void setFirstname(String firstname)
 {
  this.firstname=firstname;
 }
 public String getFirstname()
 {
  return this.firstname;
 }
 public void setLastname(String lastname)
 {
  this.lastname=lastname;
 }
 public String getLastname()
 {
  return this.lastname;
 }
 
 public void setSex(char sex)
 {
  this.sex=sex;
 }
 public char getSex()
 {
  return this.sex;
 }

 public void setOrders(Set orders)
 {
  this.orders=orders;
  calculatePrice();
 }
 public Set getOrders()
 {
  return this.orders;
 }
 // 根据order的总数量计算出平均价格,从而客户端可以获得平均价格
 private void calculatePrice()
 {
  double avgPrice=0.0;
  double totalPrice=0.0;
  int count=0;
  if(getOrders()!=null)
  {
   Iterator iter=getOrders().iterator();
   while(iter.hasNext())
   {
    double orderPrice=((Order)iter.next()).getPrice();
    totalPrice+=orderPrice;
    count++;
   }
  }
  avgPrice=totalPrice/count;
  setAvgPrice(avgPrice);
 }

 public void setAvgPrice(double avgPrice)
 {
  this.avgPrice=avgPrice;
 }
 public double getAvgPrice()
 {
  return this.avgPrice;
 }

 public void setTotalPrice(double totalPrice)
 {
  this.totalPrice=totalPrice;
 }
 public double getTotalPrice()
 {
  return this.totalPrice;
 }

 public void setDescription(String description)
 {
  this.description = description;
 }
 public String getDescription()
 {
  return this.description;
 }

}

<?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="mypack">
 <class name="Customer" table="CUSTOMER">
  <id name="id">
   <generator class="increment"/>
  </id>
  <property name="sex" column="SEX" type="char"/>
  
  <property name="name" column="NAME" type="string"/>
  
  <set name="orders" table="ORDERS">
   <key column="CUSTOMER_ID"/>
   <one-to-many class="mypack.Order"/>
  </set>
  
  <property name="description" column="DESCRIPTION" type="string"/>

 </class>
</hibernate-mapping>

package mypack;
public class Order
{
 private Long id;
 private int orderNumber;
 private double price;
 private Customer customer;

 public void setCustomer(Customer customer)
 {
  this.customer=customer;
 }
 public Customer getCustomer()
 {
  return this.customer;
 }

 public void setId(Long id)
 {
  this.id=id;
 }
 public Long getId()
 {
  return this.id;
 }

 public void setOrderNumber(int orderNumber)
 {
  this.orderNumber=orderNumber;
 }
 public int getOrderNumber()
 {
  return this.orderNumber;
 }

 public void setPrice(double price)
 {
  this.price=price;
 }
 public double getPrice()
 {
  return this.price;
 }
}
<?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="mypack">
 <class name="Order" table="ORDERS">
  <id name="id" column="ID">
   <generator class="increment"/>
  </id>
  <property name="orderNumber" column="ORDERNUMBER"/>
  <property name="price" column="PRICE"/>
  <many-to-one name="Customer" column="CUSTOMER_ID" class="Customer"/>
 </class>
</hibernate-mapping>

 

package util;
import org.hibernate.cfg.*;
import org.hibernate.*;
import mypack.*;

public class HibernateUtil
{
 private static SessionFactory sessionFactory;
 static
 {
  try
  {
   Configuration config=new Configuration();
   config.addClass(Customer.class).addClass(Order.class);
   sessionFactory = config.buildSessionFactory();
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 }

 public static SessionFactory getSessionFactory()
 {
  return sessionFactory;
 }
}

 

package service;
import util.*;
import mypack.*;
import org.hibernate.*;
public class Test
{
 public static void saveCustomer()
 {
  System.out.println("Prepare save....");
  Customer customer=new Customer();
  Session session=HibernateUtil.getSessionFactory().openSession();
  session.beginTransaction();
  Order order1=(Order)session.load(Order.class,new Long(1));
  //此处设定firstname和lastname,但是table里面
  // 根本就不存在这两个属性,就可以看到前面所说的情况了
  customer.setFirstname("andy");
  customer.setLastname("cao");
  customer.setSex('M');
  customer.getOrders().add(order1);
  customer.setDescription("this is a good boy");
  session.save(customer);
  session.getTransaction().commit();
  System.out.println("saved successful");
 }

 public static void loadCustomer()
 {
  System.out.println("Prepare load customer....");
  Session session=HibernateUtil.getSessionFactory().openSession();
  session.beginTransaction();
  Customer customer=(Customer)session.load(Customer.class,new Long(1));
  System.out.println("------------------------");
  System.out.println("------>>>>>>>>>>"+customer.getFirstname()+customer.getLastname()+" || "+customer.getAvgPrice());
  session.getTransaction().commit();
 }
 
 public static void main(String[] args)
 {
//  Test.saveCustomer();
  Test.loadCustomer();
  //System.out.println(HibernateUtil.getSessionFactory());
 }
}

sql DDL

create table CUSTOMER
(
  ID INT AUTO_INCREMENT PRIMARY KEY,
  NAME VARCHAR(40),
  SEX char(1),
  DESCRIPTION VARCHAR(40)
)
CREATE TABLE ORDERS
(
  ID INT AUTO_INCREMENT PRIMARY KEY,
  ORDERNUMBER int,
  PRICE double,
  CUSTOMER_ID INT ,
  CONSTRAINT FK_CST FOREIGN KEY(CUSTOMER_ID) REFERENCES CUSTOMER(ID)
)

Hibernate properties

hibernate.dialext=org.hibernate.dialext.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/TEST
hibernate.connection.username=root
hibernate.connection.password=
hibernate.show_sql=true

ant

<project name="hibernate-tutorial" default="compile">
 <property name="sourcedir" value="${basedir}/src"/>
 <property name="targetdir" value="${basedir}/bin"/>
 <property name="librarydir" value="${basedir}/lib"/>
 
 <path id="libraries">
  <fileset dir="${librarydir}">
   <include name="*.jar"/>
  </fileset>
 </path>

 <target name="clean">
  <delete dir="${targetdir}"/>
  <mkdir dir="${targetdir}"/>
 </target>


 <target name="compile" depends="clean, copy-resources">
  <javac srcdir="${sourcedir}"
  destdir="${targetdir}"
  classpathref="libraries"/>
 </target>

 <target name="copy-resources">
  <copy todir="${targetdir}">
  <fileset dir="${sourcedir}">
   <exclude name="**/*.java"/>
  </fileset>
  </copy>
 </target>

 <target name="run" depends="compile">
  <java fork="true" classname="service.Test" classpathref="libraries">
  <classpath path="${targetdir}"/>
  </java>
 </target>

</project>

主要讲了一些简单的hibernate对象与关系的映射,

1 应用程序调用entity类,应用程序通过set去把值赋给实体类,通过get方法取得属性值,hibernate则通过get方法把实体类中的属性数据持久化到对象数据库中,通过set方法把对象数据库中的数据load出来给应用程序,实体类和关系数据库通过配置文件建立起关联,这样的话,实体类没有侵入任何hibernate的代码,实体类中可以包括一些简单的逻辑运算,像上面的例子中,customer表中没有firstname和lastname两个属性,同时customer的提供了name的get和set方法,但是并没有name这个属性,也就是说hibernate是通过get和set方法来访问的,而不是通过属性,但是同时也可以设置成让hibernate来访问属性,而不是get和set方法,有人会像既然get和set方法是为了给属性赋值和取值用的,为什么不直接把属性设置成public,那样的话无论是应用程序还是hibernate多可以直接的访问属性,而不用set和get细节,但是这样会带来一个很明显的问题就是,程序隐藏型控制问题,假如有一个属性我只想取值不像设值,这样如果public property的话就很难解决,而javabean则很好的解决了这个问题,还有代理主键一般用包装类型而不是用原语类型,因为有的时候原语类型代表着业务意义,而包装类型的问题就是操作不方面,并且有可能带来nullpointException问题

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值