hibernate的ID生成策略(native报错)

[code="java"]





[/code]
我用native的话就这样.
[java] 09:59:58,576 DEBUG JDBCExceptionReporter:69 - could not insert: [com.tech.model.Event] [insert into EVENTS (EVENT_ID, EVENT_DATE, EVENT_TITLE) values (null, ?, ?)]
[java] java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]无法将 NULL 值插入列 'EVENT_ID',表 'test.dbo.EVENTS';该列不允许空值。INSERT 失败。
我换 increment 这个生成策略就没错...
[b]问题补充:[/b]
1楼说的答案我试了..我把ID类型都改成 INT .数据库也改成INT.但是还是报这个错误...

用mssql,你需要设置主键bigint, autoincreament
用oracle,你需要设置主键bigint, sequence
这样才能在hibernate中指定native

这与你的数据库中的主键(一般是ID)类型有关,如果主键的类型是varchar等等的字符型的话还是用uuid,如果是数字的话就用native,不过在真正的项目应用中,主键一般不会设置成数字的,毕竟数值的范围是有限的,再说了也不方便控制,大多数情况下都是varchar吧,用当前的时间加上自己定义的变量来做主键的情况还是多些。
总之一句话,如果数据库中的主键类型和Hibernate中的映射关系类型不匹配的话就会报出你粘出来的那个错误。

[size=small]楼主先说一下你的主键在数据库中是什么样的。[/size] :) :)

native是由hibernate来管理的,要求自增长的那种,不是的话,请使用assigned

[size=small]还有在测试的时候把原来的数据删掉。[/size] :) :)

EVENTS (EVENT_ID, EVENT_DATE, EVENT_TITLE) values (null, ?, ?)
好好看看这个,如果你的EVENT_ID,类型修改成了int型的话,就不能给主键插入null了,还有,检查一下你的EVENT_DATE和EVENT_TITLE,看看是否允许为空,因为你的出错信息提示说,不能插入空值。

由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。但如果是oracel数据库,需要在数据库中建立一个名称为hibernate_sequence的sequence。hibernate会自动调用该sequence。如果是sqlserver请记得把表中的id设置成自动增长identity类型
注意:如果数据库可以使用identity,那么identity是hibernate的首选,比如在sqlserver中,如果你开始使用hilo,然后改成native方式,并不会自动仍然使用hilo,hibernate会使用identity方式,这个时候就有异常出现了,必须保证sqlserver中的表使用identity方式。

你的数据库里面的id要设置为indentity(1,1)

native

  由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

你的ID既然是自增的,只要在数据库里写明自增的起始位比如identity(1,1)就行了,自增的不需要插入,把insert值里面ID栏去掉~~试试看哦,我也有过这样的问题,

Event_ID不需要插入啊。你用insert into event(event_date,event_title) values(?,?)就行了,你不是想用hibernate的id生成策略吗?id都自动生成了,你插入值是不行的

上面的朋友基本都说的比较全面了。不过我估计你的问题出在你的数据库方言设置问题。检查一下你的hibernate.cfg.xml文件中的org.hibernate.dialect.SQLServerDialect。如果没问题,我建议你全面检查一下你的配置,错误往往是在细微的地方。

native 主键生成策略 你当然不能自己进行对id赋值啊 数据库自己会管理id
插入语句中不对id赋值

native 主键生成策略 你当然不能自己进行对id赋值啊 数据库自己会管理id
插入语句中不对id赋值