`
taotao110120119
  • 浏览: 8353 次
文章分类
社区版块
存档分类
最新评论

[转]hibernate generator class="" id详解

阅读更多
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator

错误提示:
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:107)
at org.hibernate.id.IncrementGenerator.generate(IncrementGenerator.java:44)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:91)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at hibernatedao.Myuser2DAO.save(Myuser2DAO.java:28)
at HibernateDaoTest.main(HibernateDaoTest.java:24)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 user' 无效。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
hbm.xml代码:
<hibernate-mapping>
    <class name="hibernatedao.Myuser2" table="t_myuser2" schema="dbo" catalog="myssh">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="username" length="50" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="50" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

错误原因一:
要将 <generator class="increment"> </generator>中的"increment"换成"native".
将主键的生成交给数据库来维护。
原因二:对象名不能为“user"
原因三:在SQLServer企业管理器,选中表格,编辑
在底部有一个[标识],选中是



1、如果主键字段为自增类型。
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其实这个native并非实际的类型,而是hiberante根据
当前使用的数据库,自动使用对应的类型。
例如:如果sqlserver,native就对应identity
见Hiberante参考:
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

2、如果主键字段不设置为自增,但是是int型的。
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。
见hiberante参考:
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。
在集群下不要使用。

3、如果使用uuid.hex产生的随机32位数最为主键。
那么数据库的id字段类型为char,长度为32
hbm.xml中写为:
<generator class="uuid.hex" />
另外,uuid.string也是功能类似。
uuid.hex产生的是32位的16进制数字的字符串。
而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中

“assigned”
 
主键由外部程序负责生成,在   save()   之前指定一个。  
   
 
“hilo”
 
通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。   
   
 
“seqhilo”
 
与hilo   类似,通过hi/lo   算法实现的主键生成机制,需要数据库中的   Sequence,适用于支持   Sequence   的数据库,如Oracle。   
   
 
“increment”
 
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。   
   
 
“identity”
 
采用数据库提供的主键生成机制。如DB2、SQL   Server、MySQL   中的主键生成机制。   
   
 
“sequence”
 
采用数据库提供的   sequence   机制生成主键。如   Oralce   中的Sequence。   
   
 
“native”
 
由   Hibernate   根据使用的数据库自行判断采用   identity、hilo、sequence   其中一种作为主键生成方式。
 
   
 
“uuid.hex”
 
由   Hibernate   基于128   位   UUID   算法   生成16   进制数值(编码后以长度32   的字符串表示)作为主键。
 
 
“uuid.string”
 
与uuid.hex   类似,只是生成的主键未进行编码(长度16),不能应用在   PostgreSQL   数据库中。
   
 
“foreign”
 
使用另外一个相关联的对象的标识符作为主键。
<id>元素中的<generator>用来为该持久化类的实例生成唯一的标识,hibernate提供了很多内置的实现。
Increment:由hibernate自动递增生成标识符,用于为long, short或者int类型生成唯一标识。
identity :由底层数据库生成标识符(自动增长),返回的标识符是 long, short 或者int类型的。
sequence :hibernate根据底层数据库序列生成标识符,返回的标识符 是long, short或者 int类型的。
hilo     :使用一个高/低位算法来高效的生成long, short 或者int类型的标识符。
uuid.hex :用一个128-bit的UUID算法生成32位字符串类型的标识符。
native   :根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned :让应用程序在save()之前为对象分配一个标示符。
foreign :使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。

一、id生成方式
1,序列sequence 只适用于Oracle
<id name="id" column="id">
<generator class="sequence">
<param name="sequence">person_seq</param><!--指定sequence名-->
</generator>
</id>
2,自增列,适用于SQLServer、MySql
<id name="id" column="id">
<generator class="identity"/>
</id>
3,取最大值加一
<id name="id" column="id" type="integer">
<generator class="increment"/>
</id>
4,根据底层数据库指定生成方法
<id name="id" column="id">
<generator class="native"/>
</id>
使用缺省策略
针对Oracle数据库的生成方式还是sequence,只不过需要一个特定名字的sequence,"hibernate_sequence"。
5,高低位算法
<id name="id" column="id">
<generator class="hilo">
<param name="table">high_value</param>
<!--设置高位值取值的表-->
<param name="column">next_value</param>
<!--设置高位值取值的字段-->
<param name="max_lo">50</param>
<!--指定低位最大值,当取道最大值是会再取一个高位值再运算-->
</generator>
</id>
以上是hilo算法的普通形式,不适合用于squenece
在一个会话中保存多个对象
二、Hibernate中对类关系的处理:
one―to―one关系在数据库中如何体现,在JavaBean中如何体现,在
Hibernate中如何映射one-to-one关系。           
1、 数据库中:一个表的外健对应另一个表的主健,外健要加上Unique约束(外健关联)。或者是两个表共享一个主健,表现为子表中的pk同时引用了父表的pk作外健而存在(主健关联,子表中的pk和fk为一个字段)。
2、 javaBean中:在JavaBean中增加一个属性,即另外一个对象的引用,可以单向也可以双向。
3、 在hibernate中:
A、主健映射:都是one-to-one要用foreign生成策略。
以汽车car和发动机Engine(一对一关系)为例:
a、主表Car.hbm.xml的写法
<class name="Car" table="car_pk">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<one-to-one name="engine" class="Engine" cascade="all"/>
</class>
注:cascade="all" 表示增删改查Car对象时都会级联增加、删除和修改Engine对象。
级联一定是在主对象的映射文件中
b、附表Engine.hbm.xml的写法
<class name="Engine" table="engine_pk">
<id name="id" column="id" type="integer">
<generator class="foreign">
<param name="property">car</param>
</generator>
</id>
<property name="model" column="model" type="string" />
<one-to-one name="car" class="Car" c/>
</class>
注:c表示Engine应用了Car的主健作为外健。
foregin表明id的生成方式是引用表car的主键
B、外健映射:主表中用one-to-one,通过property -ref many-to-one
a、主表Car.hbm.xml的写法
<class name="Car" table="car_fk">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<one-to-one name="engine" class="Engine"
property-ref="car" cascade="save-update"/>
</class>
注:name="engine" property-ref="car"表示engine表引用了car表的主健作为他的外健。
cascade="save-update"表示增改Car对象时都会级联增加和修改Engine对象。
b、附表Engine.hbm.xml的写法
<class name="Engine" table="engine_fk">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="model" column="model" type="string" />
<many-to-one name="car" class="Car"
unique="ture"  column="carid"/>
</class>
注:unique="ture" column="carid"表示为engine表中的外健carid加上唯一约束,使之一对多关系强制转化为一对一关系。


引自http://guoyang1982.blog.163.com/blog/static/6148835120117554444978/
分享到:
评论

相关推荐

    hibernate中的generator的生成方式hibernate中的generator的生成方式

    ### Hibernate中的Generator生成方式详解 在Hibernate框架中,对象与关系映射(ORM)是其核心功能之一,它能够将面向对象模型中的类与数据库表建立对应关系,从而实现对象和数据库之间的转换。而在持久化对象的过程...

    hibernate关联关系

    ### Hibernate关联关系详解 在开发基于数据库的应用程序时,实体之间的关联关系是非常常见的。Hibernate作为一款优秀的ORM(Object-Relational Mapping)框架,为Java开发者提供了便捷的方式来处理这些关系。本文将...

    详解Hibernate一对一映射配置

    &lt;generator class="increment"/&gt; &lt;/id&gt; &lt;one-to-one name="address" class="Address" /&gt; &lt;/class&gt; &lt;class name="Address"&gt; &lt;id name="id" column="PERSON_ID"&gt; &lt;generator class="increment"/&gt; &lt;/id&gt; &lt;!--...

    hibernate.hbm.xml详解

    《hibernate.hbm.xml详解》 在Java的持久化框架Hibernate中,`hibernate.hbm.xml`文件是至关重要的,它定义了Java对象与数据库表之间的映射关系,使得对象模型能够与关系型数据库无缝对接。这篇文章将深入解析`...

    hibernate关系映射网址

    ### Hibernate关系映射详解 #### 一、引言 Hibernate是一种广泛使用的Java持久化框架,它简化了对象关系映射(Object-Relational Mapping,简称ORM)的过程,使得开发人员可以更加专注于业务逻辑的实现而无需过多...

    Hibernate各种主键生成策略与配置详解

    Hibernate不参与主键的生成过程,这意味着你需要在调用save()之前通过setter方法为对象设置一个唯一的ID。这种方法虽然灵活,但可能导致并发问题,因此不推荐在多线程或分布式环境中使用。 配置示例: ```xml &lt;id ...

    hibernate配置文件详解

    Hibernate 配置文件详解 Hibernate 是一个流行的 ORM(Object-Relational Mapping)框架,用于简化 Java 应用程序中的数据库交互。 Hibernate 的配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。下面...

    hibernate一对一关系详解

    &lt;generator class="native"/&gt; &lt;/id&gt; &lt;one-to-one name="idCard" class="IdCard" cascade="all"/&gt; &lt;/class&gt; &lt;class name="IdCard"&gt; &lt;id name="id"&gt; &lt;generator class="native"/&gt; &lt;/id&gt; &lt;one-to-one name=...

    Hibernate笔记

    ### Hibernate基础知识及应用详解 #### 一、对象持久化 **1. 概述** - **定义**: 对象持久化是指将程序中的对象状态保存到持久性存储设备中(如硬盘上的文件系统或数据库),以便应用程序可以在后续的时间点恢复...

    Hibernate一对多映射配置详解

    ### Hibernate一对多映射配置详解 #### 一、XML文件配置 在Hibernate中,一对多映射是指一个实体对象可以对应多个其他类型的实体对象。这种关系常见于许多实际应用场景,例如一个用户(User)可能拥有多个账户...

    Hibernate配置文件中映射元素详解

    【Hibernate配置文件中映射元素详解】 在对象关系映射(ORM)框架Hibernate中,对象与数据库表之间的关联是通过一个XML配置文件来定义的。这个XML文件包含了映射元素,用于描述Java类如何转化为数据库中的表。映射...

    Hibernate对象关系

    ### Hibernate对象关系详解 #### 一、单一关联(一对一) **定义** 一对一关联是指数据库中的两个表通过主键或外键的方式直接关联起来的一种关系。 **场景** 假设我们有两个类`Foo`和`Bar`,其中`Foo`有一个属性...

    Hibernate映射关联详解

    ### Hibernate映射关联详解 #### 一、理解一对多双向关联关系 在关系型数据库设计中,一对多关联是常见的数据组织方式之一。而在面向对象编程语言中,这种关系则通常通过集合(如Set或List)来实现。本文将重点...

    hibernate映射主键生成策略native

    只需要在映射文件中简单地指定`&lt;generator class="native"&gt;&lt;/generator&gt;`即可实现。同时,还需要注意数据库中序列的创建以及`hibernate.hbm2ddl.auto`属性的合理配置,以确保程序能够正常运行。 #### 六、扩展阅读 ...

    hibernate主键生成策略详解

    ### hibernate主键生成策略详解 #### 一、assigned **assigned** 主键生成策略意味着主键的值是由外部程序负责生成的,并且在执行 `save()` 方法之前必须明确指定一个值。在这种策略下,Hibernate 不参与主键的...

    hibernate自动增长字段

    ### Hibernate自动增长字段详解 #### 一、概述 在数据库设计与开发过程中,主键的自动生成是一项重要的功能。Hibernate框架提供了多种灵活的方式来实现主键的自动增长,从而简化了开发人员的工作。本文将详细介绍...

    Hibernate关联关系配置

    ### Hibernate关联关系配置详解 #### 一、一对多与多对一关系配置 在软件开发过程中,实体之间的关联关系是常见的需求之一。其中,“一对多”与“多对一”的关系尤为常见,这类关系通常用来表示实体之间的层级或...

Global site tag (gtag.js) - Google Analytics