hibernate 报错信息“ 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值”

转自:http://www.cnblogs.com/xgcblog/archive/2011/08/10/2133974.html

{"当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值"}

对于这个异常可以从两个角度来处理:A:数据库执行语句 B:直接修改NHibernate中持久化类映射配置文件id节点

A数据库执行语句:

问题描述:当在数据库表主键设计为 (Orderid  int identity primary key),相对这个主键IDENTITY_INSERT默认设置为OFF,就是不能够显示插入主键id的值,例子如下:

insert into OrderList(id,OrderName) values( 4520 , ' 电子传票订单 ' )

执行上面语句会提示一个错误:

服务器: 消息 544 ,级别 16 ,状态 1 ,行 1
IDENTITY_INSERT 设置为 OFF 时,不能向表
' OrderList ' 中的标识列插入显式值。

其中关于主键一条记录,当我们想把这条记录的id设置成我们自定义的4520时出现上面的错误,如果我们添加一些设置,修改方法如下:

-- 允许将显式值插入表的标识列中 ON - 允许 OFF - 不允许
set identity_insert OrderList ON -- 打开

insert into OrderList(id,ordername,createdate)
values(
4520 , ' set ' ,getdate())

set identity_insert OrderList OFF -- 关闭

在执行这个插入语句时多了一个设置,该设置的语法是

-- 设置语法:

SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON
| OFF }
允许将显式值插入表的标识列中

参数说明:
database:针对数据库
table:针对某张表

ON:允许插入显式值插入 标识列
OFF:不允许

注意:

当 <wbr>IDENTITY_INSERT <wbr>设置为 <wbr>OFF <wbr>时,不能为表中的标识列插入显式值 当 <wbr>IDENTITY_INSERT <wbr>设置为 <wbr>OFF <wbr>时,不能为表中的标识列插入显式值 Code
--问题注意

(
1)任何时候,会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。如果某个表已将此属性设置为 ON,并且为另一个表发出了 SET IDENTITY_INSERT ON 语句,则 Microsoft® SQL Server™ 返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON 并报告此属性已设置为 ON 的表

(
2)如果插入值大于表的当前标识值,则 SQL Server 自动将新插入值作为当前标识值使用

(
3)SET IDENTITY_INSERT 的设置是在执行或运行时设置,而不是在分析时设置

上面执行语句中:把要执行的语句前后加上该设置,当然上面针对事一条记录插入操作,在这条记录插入操作后,如果再次插入数据时,没有启用该设置,Orderid主键列会根据上面自定义表示4520,自动增长到4521.这个操作很灵活关键看个人怎么利用.

B:修改配置文件

我们通过直接修改配置文件来处理这个问题,

出错时文件配置:

-- hibernate持久化类配置 注意id中Generator子节点设置Class属性为:assigned自动增长
< hibernate - mapping xmlns = " urn:nhibernate-mapping-2.2 " >
< class name = " TestHibernateExpre.Entities.OrderListModel,TestHibernateExpre " table = " OrderList " >
< id name = " Orderid " column = " id " type = " int " >
<!-- id中参数的设置问:native / assigned / foreign / increment -->
< generator class = " assigned " ></ generator >
</ id >
</ class >

修改后文件配置:

-- Hibernate中关于持久化类的配置 注意id下Generator子节点 class属性配置为native
< hibernate - mapping xmlns = " urn:nhibernate-mapping-2.2 " >
< class name = " TestHibernateExpre.Entities.OrderListModel,TestHibernateExpre " table = " OrderList " >
< id name = " Orderid " column = " id " type = " int " >
<!-- id中参数的设置问:native / assigned / foreign / increment -->
< generator class = " native " ></ generator >
</ id >
</ class >

 

### 回答1: 关于您的问题,我可以给出回答。在使用 Hibernate ,当将字段设置为空字符串Hibernate 会将该字段插入数据库中,但是该字段的将变为 NULL。这是因为在数据库中,空字符串和 NULL 是不同的概念,空字符串表示该字段有但为空,而 NULL 表示该字段没有。如果您希望将空字符串保存到数据库中而不是变为 NULL,可以使用 Hibernate 的 @Column 注解的 nullable 属性设置为 false,如下所示: @Column(nullable = false) private String yourFieldName; 这将强制 Hibernate 将空字符串插入数据库中。 ### 回答2: 在使用Hibernate进行数据插入,如果将字段设置为空字符串,并且这个字段在数据库的表结构中不允许为空(即设置了NOT NULL约束),那么Hibernate会将该字段的插入为NULL。 这是因为Hibernate遵循数据库的约束规则,在某些数据库中,将空字符串插入到不允许为空的字段会导致异常。为了避免这种情况,Hibernate会自动将空字符串转换为NULL来符合数据库的约束规则。 如果开发者想要将空字符串插入数据库的某个字段中,可以考虑以下两种方法: 1. 更改数据库表结构:将对应字段的约束改为允许为空,这样就可以插入空字符串了。 2. 使用自定义的setter方法:在实体类中添加一个setter方法,在方法体中判断,如果传入参数为null或空字符串,则将其设置为一个自定义的(例如"空"),这样就可以将空字符串插入数据库中了。 总之,使用Hibernate,当字段设置为空字符串,但数据库表结构不允许为空Hibernate会将其插入为NULL,为了避免这种情况,可以修改表结构或自定义setter方法进行处理。 ### 回答3: 在使用Hibernate,当将字段设置为空字符串并尝试插入数据库,该空字符串会被转换为NULL。 这是因为Hibernate通过空间极小的Sequence Generator来判断实体是否有自动生成的主键。当字段被设置为为空字符串Hibernate会将其内部的字符串数据处理为空,因此在插入数据库会将其转换为NULL。 为了避免将空字符串转换为NULL,我们可以通过在实体的属性上设置注解来解决此问题。我们可以使用@NotEmpty注解来确保字段不为空字符串,例如: ``` @Entity public class ExampleEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotEmpty private String field; // 省略 getter 和 setter 方法 } ``` 通过将@NotEmpty注解添加到字段上,Hibernate将不允许将该字段设置为空字符串,并在插入验证注解的条件,如果字段为空字符串,将抛出异常。 另外,可以考虑使用@NotBlank注解来确保字段既不为空字符串也不为空白字符串,并且还可以使用@Column(nullable = false)来在数据库层面上强制该字段不为空。 综上所述,使用Hibernate,当字段被设置为空字符串并插入数据库,会被转换为NULL。我们可以通过标记注解来限制字段不为空字符串,从而避免将其转换为NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值