id标签
被映射的类必须声明对应数据库表主键字段。大多数类有一个JavaBeans风格的属性,为每一个实例包含唯一的标识。<id> 元素定义了该属性到数据库表主键字段的映射。
<id
name="propertyName"
type="typename"
column="column_name"
unsaved-value="any|none|null|id_value"
access="field|property|ClassName">
<generator class="generatorClass"/>
</id>
name (可选): 标识属性的名字。
type (可选): 标识Hibernate类型的名字。
column (可选 - 默认为属性名): 主键字段的名字。
unsaved-value (可选 - 默认为null): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。这可以把这种实例和从以前的session中装载过(可能又做过修改--译者注)但未再次持久化的实例区分开来。
access (可选 - 默认为property): Hibernate用来访问属性值的策略。
如果 name属性不存在,会认为这个类没有标识属性。
unsaved-value 属性很重要!如果你的类的标识属性不是默认为null的,你应该指定正确的默认值。
还有一个另外的<composite-id>声明可以访问旧式的多主键数据。我们强烈不鼓励使用这种方式。
1. generator
必须声明的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数,用<param>元素来传递。
<id name="id" type="long" column="uid" unsaved-value="0">
<generator class="net.sf.hibernate.id.TableHiLoGenerator">
<param name="table">uid_table</param>
<param name="column">next_hi_value_column</param>
</generator>
</id>
所有的生成器都实现net.sf.hibernate.id.IdentifierGenerator接口。这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。
sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
hilo (高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key 和next)作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要使用这种生成器。
seqhilo(使用序列的高低位)
使用一个高/低位算法来高效的生成long, short或者 int类型的标识符,给定一个数据库序列(sequence)的名字。
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned(程序设置)
让应用程序在save()之前为对象分配一个标示符。
foreign(外部引用)
使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。
2. 高/低位算法(Hi/Lo Algorithm)
hilo 和 seqhilo生成器给出了两种hi/lo算法的实现,这是一种很令人满意的标识符生成算法。第一种实现需要一个“特殊”的数据库表来保存下一个可用的“hi”值。第二种实现使用一个Oracle风格的序列(在被支持的情况下)。
<id name="id" type="long" column="cat_id">
<generator class="hilo">
<param name="table">hi_value</param>
<param name="column">next_value</param>
<param name="max_lo">100</param>
</generator>
</id>
<id name="id" type="long" column="cat_id">
<generator class="seqhilo">
<param name="sequence">hi_value</param>
<param name="max_lo">100</param>
</generator>
</id>
很不幸,你在为Hibernate自行提供Connection,或者Hibernate使用JTA获取应用服务器的数据源连接的时候无法使用hilo 。Hibernate必须能够在一个新的事务中得到一个"hi"值。在EJB环境中实现hi/lo算法的标准方法是使用一个无状态的session bean。
3. UUID算法(UUID Algorithm )
UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。在Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了。
不要试图在PostgreSQL中使用uuid.string。
4. 标识字段和序列(Identity Columns and Sequences)
对于内部支持标识字段的数据库(DB2,MySQL,Sybase,MS SQL),你可以使用identity关键字生成。对于内部支持序列的数据库(DB2,Oracle, PostgreSQL, Interbase, McKoi,SAP DB),你可以使用sequence风格的关键字生成。这两种方式对于插入一个新的对象都需要两次SQL查询。
<id name="id" type="long" column="uid">
<generator class="sequence">
<param name="sequence">uid_sequence</param>
</generator>
</id>
<id name="id" type="long" column="uid" unsaved-value="0">
<generator class="identity"/>
</id>
对于跨平台开发,native策略会从identity, sequence 和hilo中进行选择,取决于底层数据库的支持能力。
下面再给个简单例子:
<id name="id" type="long" column="uid">
<generator class="sequence">
<param name="sequence">uid_sequence</param>
</genarator>
</id>
注意:
<generator class=""> 里面可以选啊!推荐Oracle用sequence,seqhilo
分享到:
相关推荐
使用<composite-id> 标签(并且内嵌元素)代替通常的<id>标签。比如,OrderLine类具有一个主键,这个主键依赖于Order的(联合)主键。 <composite-id name="id" class="OrderLineId"> </composite-id> ...
标签id 5 主键生成器Generator 6 多对一, 一对一, 一对多, 多对多 7 hibernate多对一关联映射(Hibernate_Many2One) 7 hibernate一对一主键关联映射(单向关联Person---->IdCard) 8 hibernate一对一主键关联映射...
轻量级的Hibernate,用于android客户端,通过简单的标签@Table,@Column,@Id即可持久化表,字段和id的定义。
Hibernate的基本配置,以及个配置文件中的每个标签的说明。
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用<composite-id>标签进行映射,其它属性采用正常映射
一、含演示数据库建立脚本(较简单) 二、使用Struts、Hibernate和display超简单的实现了分页,你不用在页面上再写很多和很多判断,简单到只需要几行语句: ... 三、由于使用了display,所以自动实现了Excel ...
个人博客系统【Spring3+Hibernate3+Struts2】【SSH】 SSH个人博客系统 学习SSH时,做的一个个人博客系统。 需求分析: 对于本博客系统,是面向个人使用,主要用于记录日常学习知识与文章分享。 网站博主可以发表文章...
•FILE_ID:文件ID,32个字符,用Hibernate的uuid.hex算法生成。 •FILE_NAME:文件名。 •FILE_CONTENT:文件内容,对应Oracle的Blob类型。 •REMARK:文件备注。 文件数据存储在Blob类型的FILE_CONTENT...
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
主要是为了引入时间等字段,来试验一下struts2的时间标签是否好用.这次为了做成一个好点的实例.所以换掉了表结构.为歌词表.并附带2万首歌词的数据库.因为歌词插入数据太大.所以单另上传了.如果不需要这两万条数据的...
如下图: 在上述界面的“Properties”标签中可以配置hbm的其他选项,包括文件扩展名,聚合列名,ID生成规则等。完成后,系统会自动生成一个名为“UserInfo.hbm”的文件,我们可以通过这个文件生成相关的存根类。在...
many-to-one:标签中对于cascade的取值delete,delete-orphan,all-delete-orphan(只用unique属性值不为true不能出现)慎用 cascade:级联属性 none:不做任何级联操作 save-update:对当前对象执行save,update, ...
<bean id="cms_content_list" class="com.jeecms.cms.action.directive.ContentListDirective"/>(声明标签对应的类) <bean id="staticPageSvc" class="com.jeecms.cms.staticpage.StaticPageSvcImpl"> ...
3. 设置Bean作用域 265 4. 为Bean配置集合(List,Set,Map) 266 5. 调用构造方法创建Bean 271 6. 指定Bean引用与自动装配 276 (二) AOP 278 1. AOP简介 278 (三) Spring 3.X 新特性(JavaConfig,SpEL)简介 285 1. ...
打开server项目下的hibernate.properties 文件,修改Hibernate数据库方言的配置(hibernate.dialect)为项目选用的数据库类型,如果采用是mysql 5.0数据库,设置为org.hibernate.dialect.MySQLDialect, 如果采用oracle...
SQLAlchemy 是 Python 界著名 ORM 框架,地位与 Java 界 Hibernate 类似。而 Thing 不是对 SQLAlchemy 的包装,只使用了其核心部分(数据库适配器等),ORM 部分完全自行实现。这一做法使 Thing 非常小巧,核心代码...
如果你觉得hibernate,ibatis等orm框架过于笨重,不烦试下jdao,它可以在团队开发中规范团队持久层代码,较少开发量,特别在单表操作上基本是对象操作,对于复杂SQL查询也有较好的封装。一、使用DAO方式操作数据:...
像@hibernate.clas、@hibernate.property、@struts.action-forward等等这些特定的注释标签需要去查XDoclet的相关文档了,Xdoclet对目前流行的多种框架、技术都提供了相关的支持。 这样,我们就能在使用ant编译工程...
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- 新闻类型 --> <bean id="newsclassDAO" class=...
2、封装DAO操作,大大简化了数据库操纵业务,统一的查询参数接口,统一的分页对象,可创建单机可集群环境的数据唯一ID。支持Hibernate,JPA和MongoDB操纵 3、统一配置管理,配置文件不随工程一起发布,可以有效地...