【Java】Hibernate(四)对象/关系数据库映射基础

【映射】

       对象和关系数据库之间的映射通常是用一个XML文档来定义的。映射文档被设计为易读的,并且可以手工修改。映射语言以Java为中心,这就意味着映射文档是按照持久化类的定义来创建的,而非表的定义。
       第一篇概述博客中,我们简要总结了Hibernate开发步骤,首先创建持久化类。 然后创建对象-关系映射文件,*.hbm.xml。创建Hibernate配置文件,hibernate.cfg.xml,最后编写访问数据库的代码。按照这个流程,总结下各步骤具体的使用细节。                   



【实体类设计原则】


       1.实现无参的默认构造函数
       2.提供一个标识
       3.不要使用final修饰实体类。因为final的类不能被继承。
       4.生成 getter setter方法


【*hbm.xml映射文件解读】

       拿下面的代码举个例子     
<?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="com.bjpowernode.hibernate">
		<class name="User1" table="t_user1">
			<id name="id" column="user_id" length="32">
				<generator class="uuid"/>
			</id>
			<property name="name" length="30" unique="true" not-null="true"/>
			<property name="password"/>
			<property name="createTime" type="date" column="create_time"/>
			<property name="expireTime"/>
		</class>
	</hibernate-mapping> 

标签介绍:

       ☆Doctype:所有的xml映射都要定义doctype,DTD可以从上面的URL中获取。

       ☆ hibernate-mapping:这个属性包括一些可选的属性。上面的例子中就用到了package属性,指定了包前缀。Hibernate-mapping元素允许嵌套多个<class>映射,但是最好还是一个持久化类对应一个映射文件。

       ☆class:实体类到表,就采用class标签映射,该元素就是来定义持久化类的,它的属性很丰富。
      用过属性的介绍几个:
       name:为持久化类的名称。
       table:对应数据库表名。
       proxy:指定一个接口,在延迟加载时作为代理使用,可以使用该类自己的名字。
       lazy:用来体现延迟加载。
       abstract: 用于在<union-subclass> 继承结构中标识抽象超类。
       discriminator-value:用来区分不同的子类值,在多态行为时使用,可接受的值包括null和not null。
       
       ☆id:定义了该属性到数据库表主键字段的映射。被映射的类必须定义对应数据库表主键字段。name用来标识属性的名字,column为主键字段的名字。

       ☆generator:一个Java类的名字,用来为该持久化类实例生成唯一标识。如果生成器实例需要某些配置值或初始化参数,用<param>元素传递。所有生成器都实现org.hibernate.id.IdentifierGenerator接口。
       主键生成策略简介:
1.Identity:内部支持标识字段的数据库如MySQL SQL,可以使用Identity关键字生成。
2.Sequence:内部支持序列的数据库Oracle等,使用sequence。
3.UUID:用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的,UUID被编码为一个32位16进制数字的字符串。UUID包含了IP地址,JVM启动时间,系统时间和一个计数器值(JVM中唯一)。因为这是Hibernate生成的,和数据库没关系,所以UUID效率快。
        4.Native:涵盖identity 和sequence。
5.Assigned:手动分配,如果你需要应用程序分配一个标识符,非hibernate自己生成,就可以使用手动分配。
6.Foreign :拿到关联对象的标识作为自己的主键,使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。
 
       ☆discriminator:在“一棵对象继承树对应一个表”的策略中,该元素是必需的,它定义了表的鉴别器字段。鉴别器字段的实际值是根据<class>和<subclass>元素中discriminator-value属性得来的。后续的继承映射博客会再做介绍。

       ☆property:实体类中的普通属性(不包括集合。自定义类和数组)对应表的字段。它为类定义了一个持久化的JavaBean风格的属性。采用<property>标签映射如果实体类的名称或实体类中的属性的名称和数据库关键字重复,将会出现问题可以考虑采用table属性和column属性对其进行重新命名。

      PS: hibernate.cfg.xml 中hbm2ddl属性设为update,sessionfactory建立的时候,就会自动建表。
<property name="hibernate.hbm2ddl.auto">update</property>

【Hibernate test方法】

public void testSave1(){
		Session session =null;
		try{
			session=HibernateUtils.getSession(); //获得session 
			session.beginTransaction();//开启事务
			
			session.getTransaction().commit();// 提交事务
		}catch(Exception e){
			e.printStackTrace();//打印堆栈 
			session.getTransaction().rollback();//事务回滚
		}finally{
			HibernateUtils.closeSession(session);//关闭session
		}
}

 【小结】

        后续介绍一对一映射,下篇见~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
private static void printTableMetaInfo(Session session) { Connection connection = session.connection(); try { DatabaseMetaData metaData = connection.getMetaData(); ResultSet result = metaData.getColumns(null, null, NameOfTable, null); String strInJava = ""; String typeInJava; while (result.next()) { String columnName = result.getString(4); if ("stampTime".equalsIgnoreCase(columnName)) { continue; } int columnType = result.getInt(5); String nameFirstLetterLower = columnName.substring(0, 1).toLowerCase() + columnName.substring(1); switch (columnType) { case Types.VARCHAR: case Types.LONGVARCHAR: case Types.LONGNVARCHAR: case Types.NVARCHAR: case Types.CHAR: typeInJava = "String"; break; case Types.TINYINT: case Types.SMALLINT: case Types.INTEGER: typeInJava = useInteger ? "Integer" : "int"; break; case Types.TIMESTAMP: case Types.BINARY: typeInJava = "Calendar"; break; case Types.DECIMAL: typeInJava = "BigDecimal"; break; case Types.BIGINT: typeInJava = "BigInteger"; break; case Types.LONGVARBINARY: typeInJava = "byte[]"; break; case Types.DATE: typeInJava = "Calendar"; break; default: throw new Exception("Unknown type " + columnType + " and column is " + columnName); } strInJava += " private " + typeInJava + " " + nameFirstLetterLower + ";\n"; // strInHibernate += "\n"; } String str = "import javax.persistence.Entity;\n" + "import javax.persistence.Id;\n" + "import javax.persistence.Table;\n" + "import java.util.Calendar;\n\n"; str += "@Entity\n"; str += "@Table(name=\"$\")\n".replace("$", NameOfTable); str += "public class $ {\n".replace("$", NameOfTable.substring(2)); str += "\n @Id\n"; str += strInJava; str += "}"; System.out.println(str); StringSelection stringSelection = new StringSelection(str); Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard(); clpbrd.setContents(stringSelection, null); } catch (Exception e) { e.printStackTrace(); }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值