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

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

 

分享到:
评论

相关推荐

    hibernate初级教程.

    【hibernate初级教程】 Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本教程将带你深入理解Hibernate的核心概念,帮助初学者快速入门。 一、...

    hibernate初级教程图解

    Hibernate通过将Java对象映射到数据库表,以及将Java对象之间的关联映射到表之间的外键关系,实现了对象和关系型数据库之间的桥梁作用。这种映射机制使得开发人员能够更加专注于业务逻辑的实现,而将数据访问的细节...

    Apress - Pro Hibernate3

    总之,《Pro Hibernate3》不仅是一本介绍Hibernate的书籍,更是帮助程序员深入理解对象关系映射技术和Hibernate框架的重要参考资料。无论你是初学者还是有一定经验的开发者,都能从中获益匪浅。

    Hibernate PPT-1

    【Hibernate PPT-1】是关于Hibernate框架的初级讲解,主要涵盖了Hibernate的基础特性和体系结构,以及O/R Mapping的理解。Hibernate是一个对象关系映射(ORM)框架,它将Java对象模型与关系数据库模型进行映射,使得...

    整合Struts + Spring + Hibernate 初级源码

    Hibernate是一个对象关系映射(ORM)框架,它允许开发者用Java对象模型来操作数据库,避免了直接编写SQL语句。Hibernate通过配置hibernate.cfg.xml文件和实体类的注解或XML映射文件,实现了Java对象与数据库表的映射...

    hibernate 第一节课

    本节课程主要围绕“hibernate 第一节课”,我们将深入探讨Hibernate的核心概念、配置、对象关系映射(ORM)以及如何使用它来执行基本的数据库操作,如添加、删除、修改和查询(CRUD操作)。 1. Hibernate核心概念:...

    Hibernate初级学习

    ### Hibernate初级学习知识点详解 #### 一、Hibernate简介与ORM概念 - **ORM技术定义**:对象关系映射(Object/Relational Mapping, ORM)是一种编程技术,用于将对象模型与关系型数据库模型进行桥接。它使得开发...

    Hibernate初级编程

    第六步,对象映射(Hibernate 映射文件)。通过 Hibernate 工具,将 "student" 表映射为 Java 类,自动生成对应的 .hbm.xml 文件,这定义了 Java 类与数据库表之间的对应关系。 第七步,修改配置文件。在生成的 ...

    hibernate-first-application:Hibernate第一个应用程序

    Hibernate是一个流行的开源对象关系映射(ORM)框架,它简化了Java开发者与数据库之间的交互,使得我们可以用面向对象的方式来处理数据库操作。 描述中的“Hibernate优先应用程序”可能是指一个以Hibernate为核心的...

    hibernate资料从初级到高级

    Hibernate,作为Java领域中一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。对于初学者而言,理解并掌握Hibernate的基本概念和核心功能是至关重要的。以下是对Hibernate从初级到高级的知识点详细解析。...

    初级软件工程师HIbernate

    Hibernate提供了一套完整的解决方案,包括对象-关系映射(ORM)、缓存管理、事务处理等。 - **优势**:提高了开发效率,降低了维护成本,增强了应用程序的可移植性和可扩展性。 通过以上分析可以看出,无论是...

    Hibernate 文档 适合初级编程

    Hibernate是一个开放源代码的对象关系映射(ORM)框架,它简化了Java应用程序对关系数据库的访问。通过Hibernate,开发者可以将对象模型转换为关系数据模型,从而避免了直接编写SQL语句,提高了开发效率和代码可维护...

    Hibernate的小例子

    4. **持久化映射**:Hibernate使用XML或注解来定义对象-关系映射,例如使用Hibernate的注解如@Column,@GeneratedValue等。 5. **Session接口**:Hibernate的主要工作接口,负责与数据库的交互,如保存、更新、查询...

    hibernate 经典题目 其中包括很多核心的题目

    【hibernate】知识点详解: ...这些知识点覆盖了 Hibernate 的基础配置、映射机制、关系映射、主键生成、查询语言、API 使用及对象状态管理等方面,对初级程序员来说,理解并掌握这些内容是学习 Hibernate 的重要基础。

    hibernate入门框架源码

    1. **对象关系映射(ORM)**:Hibernate是ORM工具,它将Java对象与数据库中的记录进行映射,使我们能以面向对象的方式来操作数据库,而不是传统的SQL语句。 2. **实体类和映射文件**:在Hibernate中,我们创建Java...

    hibernate3+mysql简单学习实例.rar

    2. **对象关系映射(ORM)**: ORM是Hibernate的核心特性,它通过映射文件将Java对象和数据库表关联起来,使得开发者可以使用面向对象的方式来处理数据库操作,减少了直接操作SQL的复杂度。 3. **Hibernate配置**: ...

    hibernate项目开发

    Hibernate,作为Java领域中的一款强大且广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者通过面向对象的方式处理数据,从而避免了传统SQL语句的繁琐编写。本教程将深入探讨Hibernate的核心...

    极好的hibernate入门实例

    这个标签明确了讨论的主题,即Hibernate,一个对象关系映射(ORM)框架,它允许开发者在Java应用程序中使用对象而不是SQL语句来操作数据库。Hibernate处理了对象和数据库表之间的映射,提供了透明的数据访问层。 **...

    hibernate jar包参考图片

    Hibernate是一个开放源代码的对象关系映射(Object Relational Mapping,简称ORM)框架,它对JDBC进行了非常轻量级的对象封装,它为程序员提供了强大的数据持久化服务。通过Hibernate,可以使用面向对象的方式操作...

    struts.spring.hibernate整合教程

    Struts、Spring和Hibernate是Java Web开发中的三大框架,它们分别负责不同的职责:Struts用于控制应用程序的流程,Spring提供全面的依赖注入和面向切面编程能力,而Hibernate则是一个强大的对象关系映射(ORM)工具...

Global site tag (gtag.js) - Google Analytics