`
anxin587
  • 浏览: 23424 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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问题

 

分享到:
评论

相关推荐

    java上手实战项目推荐苍穹外卖详细分析和对比瑞吉外卖

    理解数据库操作:通过与数据库的交互,了解SQL语言和ORM(对象关系映射)工具,如Hibernate或JPA。 提升前端技能:如果项目包含前端开发,可以学习如何使用HTML、CSS、JavaScript以及可能的前端框架如React或Angular...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

Global site tag (gtag.js) - Google Analytics