欢迎投稿

今日深度:

IT忍者神龟之Hibernat持久化对象-数据表映射配置回

IT忍者神龟之Hibernat持久化对象-数据表映射配置回顾,忍者神龟hibernat


1.持久化对象POJO编写规则:

1) 有空参public构造器;

2) 提供标识属性,映射数据表主键;

3) 属性提供settergetter方法;

4) 属性使用基本数据类型的包装类型。基本类型在数据库中不能区分null0

5) 不使用final修饰。如果使用final则无法生成代理对象;当使用了finalload查询将如同get查询。


2.POJOOID: 

OID是持久化类与数据表主键对应的属性,用来唯一区分持久化对象。

自然主键:采用数据库中有意义的列的值作为主键(有意义)

代理主键:采用自动生成的流水号、UUID作为主键(无意义,推荐)


3.数据类型: 

基本类型无法区分null0,开发中POJO属性都使用包装类型。


4.持久化类配置POJO.hbm.xml: 

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- package="POJO所在包" --> <hibernate-mapping package="cn.cvu.domain">     <!-- name="POJO类" table="数据库中的表单" catalog="数据库,对应项目的hibernate核心配置文件中<property name='hibernate.connection.url'>jdbc:mysql:///数据库</property> " -->     <class name="User" table="table_user" catalog="db_hibernate">         <!-- name="POJO对应的属性" column="表单的主键 列" type="POJO属性的数据类型" -->         <id name="id" column="id" type="int">             <!-- class="主键生成策略" -->             <generator class="native"></generator>             <!-- 常用策略:increment、identity、sequence、native、uuid、assigned -->         </id>         <!-- name="POJO中对应属性" colunm="表单中的 列" type="POJO数据类型" -->   <!—hibernate定义的数据类型string -->         <property name="name" column="name" type="string"></property>     <!—java定义的为int -->         <property name="age"  column="age"   type="int"   ></property   <!—sql定义的数据类型使用sql-type声明 -->         <property name="city" column="city" sql-type="string"></property>           <!-- 常用属性:length:列值长度、not-null:非空true/false、unique:唯一true/false  -->     </class> </hibernate-mapping>


1主键生成策略increment:顶层递增: 

由hibernate自动完成,原理:先查询最大值,再插入此值加一。OID必须为long、int或short类型。

优点:跨数据库。

缺点:多线程并发访问问题。


2主键生成策略identity:底层递增: 

由数据库自动完成,要求数据库必须支持自增主键。mysql支持,oracle不支持。OID必须为long、int或short类型。

优点:无并发访问问题。


3主键生成策略sequence:序列: 

由数据库自动完成递增,要求数据库必须支持序列。mysql不支持,oracle支持。OID必须为long、int或short类型。

Oracle:

    1创建序列:create sequence myseq;

    2调用序列:insert into customer values (myseq.nextval); #序列加一


4主键生成策略native:本地:

采用数据库支持的自增策略。 mysql:identity,oracle:sequence。OID必须为long、int或short类型。

优点:跨数据库平台。


5主键生成策略uuid:标识符: 

由数据库自动创建。 uuid是32位唯一字符串,表单主键使用varchar类型,POJO对应属性是String类型。


6主键生成策略assigned:手动指定: 

在调用hibernate时手动指定主键的值,用于自然主键(有意义的)。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public void testInsertAssigned() {         Session session = UtilGetSesstion.openSession();         Transaction transaction = session.beginTransaction();                   User user = new User();         user.setId(20130124);       //手动设置主键         user.setName("EminemXXX");         user.setAge(42);         user.setCity("NewYorkXXX");         session.save(user);                   transaction.commit();         session.close();     }


7主键生成策略:复合主键: 

(1)编写POJO类 Person.java: 

?
1 2 3 4 5 6 7 8 9 10 11 package cn.cvu.domain; import java.io.Serializable; //务必事先序列化接口 public class Person implements Serializable {     private String firstName;       //对应表单的复合主键     private String secondName;      //对应表单的复合主键     private String address;           //get/set     //toString }


(2)配置POJO.hbm.xml:  

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.cvu.domain">     <class name="Person" table="table_person" catalog="db_hibernate">         <!-- 复合id -->         <composite-id>             <!-- 主键列 name="POJO属性" column="表单列名" -->             <key-property name="firstName" column="nameFirst"></key-property>             <key-property name="secondName" column="nameFirst"></key-property>         </composite-id>         <!-- 普通列 name="POJO属性" column="表单列名" type="数据类型" -->         <property name="address" column="addr" type="string"></property>     </class> </hibernate-mapping>


(3)配置hibernate.cfg.xml,加载Person.hbm.xml文件: 

 


4)操作类的方法: 

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public void testInsert() {         Configuration configuration = new Configuration().configure();         SessionFactory sessionFactory = configuration.buildSessionFactory();         Session session = sessionFactory.openSession();         Transaction transaction = session.beginTransaction();                   Person person = new Person();         person.setFirstName("C");         person.setSecondName("Vigiles");         person.setAddress("Beijng");         session.save(person);                   transaction.commit();         session.close();         sessionFactory.close();     }


5)结果:

 

INFO: HHH000262: Table not found: tb_person
2013-11-5 10:07:12 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: HHH000388: Unsuccessful: create table db_hibernate.tb_person (namef varchar(255) not null, names varchar(255) not null, age integer, city varchar(255), primary key (namef, names)) type=InnoDB
2013-11-5 10:07:12 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=InnoDB' at line 7
2013-11-5 10:07:12 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete

?
1 2 3 <!-- 方言-指定数据库为5.1版本之后的SQL语言 -->         <property name="hibernate.dialect">   org.hibernate.dialect.MySQL5InnoDBDialect</property>

-end 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4521.html NewsArticle IT忍者神龟之Hibernat持久化对象-数据表映射配置回顾,忍者神龟hibernat 1.持久化对象 POJO 编写规则: 1)有空参 public 构造器; 2)提供标识属性,映射数据表主键; 3)属性提供 setter 和...
相关文章
评论暂时关闭