hibernate之实体表示法
hibernate中有3种内建的实体模式:
POJO
基于POJO,持久化类的一种领域模型实现。这是目前为止你所见到的,是默认的实体模式。
MAP
不需要Java类,用HashMap在Java应用程序中表示实体。这个模式允许完全动态应用程序的快速原型。
DOM4J
不需要Java类,实体被表示为xml元素,基于dom4j API。这种模式对于导出或者导入数据,或者通过XSLT处理来渲
染和转换数据时特别有用。
Map表示法
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>hibernateTest</groupId> <artifactId>hibernateTest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>hibernateTest</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.3.1.GA</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.5.2</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.4.GA</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.3.0</version> <scope>runtime</scope> </dependency> </dependencies> <build> <finalName>hibernateTest</finalName> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
resources/hibernate.cfg.xml:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="sessionFactory"> <!-- 指定连接数据库所用的驱动 --> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- 指定连接数据库的url,hibernate连接的数据库名 --> <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:XE</property> <property name="hibernate.connection.useUnicode">true</property> <property name="hibernate.connection.characterEncoding">gbk</property> <!-- 指定连接数据库的用户名 --> <property name="hibernate.connection.username">system</property> <!-- 指定连接数据库的密码 --> <property name="hibernate.connection.password">password</property> <!-- 指定连接池里最大连接数 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 指定连接池里最小连接数 --> <property name="hibernate.c3p0.min_size">5</property> <!-- 指定连接池里连接的超时时长,以秒为单位 --> <property name="hibernate.c3p0.timeout">120</property> <!-- 指定连接池里最大缓存多少个Statement对象 --> <property name="hibernate.c3p0.max_statements">100</property> <!-- 每隔XX秒检查连接池里的空闲连接 ,单位是秒 --> <property name="hibernate.c3p0.idle_test_period">120</property> <!-- 当连接池里面的连接用完的时候,C3P0一次获取的新的连接数 --> <property name="hibernate.c3p0.acquire_increment">2</property> <!-- 指定数据库方言 --> <property name="dialect">org.hibernate.dialect.OracleDialect</property> <!-- 显示Hibernate持久化操作所生成的SQL --> <property name="show_sql">true</property> <!-- 将SQL脚本进行格式化后再输出 --> <property name="hibernate.format_sql">true</property> <!-- 罗列所有的映射文件 --> <mapping resource="hibernateTest/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
hibernateTest/Student.java:
package pojo; import java.io.Serializable; public class Student implements Serializable{ private int id; private String name; private String address; private int age; public int getId() { return id; } @SuppressWarnings("unused") private void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
hibernateTest/Student.hbm.xml , 请注意:<class>中的entity-name属性
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class entity-name="studentMap" table="STUDENT"> <id name="id" column="ID" type="int"> <generator class="sequence"> <!-- seq_student就是表student的主键自增的sequence --> <param name="sequence">seq_student</param> </generator> </id> <property name="name" column="name" type="string" /> <property name="address" column="address" type="string" /> <property name="age" column="age" type="int" /> </class> </hibernate-mapping>
util/HibernateUtil.java:
package util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static{ try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable e) { throw new ExceptionInInitializerError(e); } } public static SessionFactory getSessionFactory(){ return sessionFactory; } public static void shutdown(){ getSessionFactory().close(); } }
util/StudentManager.java:
package util; import java.util.HashMap; import java.util.Map; import org.hibernate.Session; import org.hibernate.Transaction; public class StudentManager { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { Map student = new HashMap(); //key:name关联Student.hbm.xml的name="name" student.put("name", "fuhaidong"); //key:address关联Student.hbm.xml的name="address" student.put("address", "美国"); //key:age关联Student.hbm.xml的name="age" student.put("age", 28); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = session.beginTransaction(); //studentMap关联Student.hbm.xml中的entity-name="studentMap" session.saveOrUpdate("studentMap", student); transaction.commit(); session.close(); } }
<class name="....">属性已经被<class entity-name="....">取代。
Map实体表示法,一对多的例子:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 注意下entity-name属性的使用 --> <class entity-name="ItemEntity" table="ITEM_ENTITY"> <id name="id" type="long" column="ITEM_ID"> <generator class="native" /> </id> <property name="initialPrice" type="big_decimal" column="INIT_PRICE" /> <property name="description" type="string" column="DESCRIPTION" /> <many-to-one name="seller" entity-name="UserEntity" column="USER_ID" /> </class> <!-- 把两个映射写到一个文件里为了方便演示 --> <!-- 注意这里entity-name属性的使用 --> <class entity-name="UserEntity" table="USER_ENTITY"> <id name="id" type="long" column="USER_ID"> <generator class="native" /> </id> <property name="username" type="string" column="USERNAME" /> <bag name="itemsForSale" inverse="true" cascade="all"> <key column="USER_ID" /> <!-- 注意这里entity-name属性的使用 --> <one-to-many entity-name="ItemEntity" /> </bag> </class> </hibernate-mapping>
package pojo; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.hibernate.Session; import org.hibernate.Transaction; import util.HibernateUtil; public class Ass { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { Map user = new HashMap(); user.put("username", "johndoe"); Map item1 = new HashMap(); item1.put("description", "An item for auction"); item1.put("initialPrice", new BigDecimal(99)); item1.put("seller", user);//用于双向导航 Map item2 = new HashMap(); item2.put("description", "Another item for auction"); item2.put("initialPrice", new BigDecimal(123)); item2.put("seller", user);//用于双向导航 Collection itemsForSale = new ArrayList(); itemsForSale.add(item1); itemsForSale.add(item2); user.put("itemsForSale", itemsForSale); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = session.beginTransaction(); session.save("UserEntity",user); transaction.commit(); session.close(); } }