日期:2014-05-20  浏览次数:20913 次

我遇到Dialect does not support identity key generation 遇到过这个问题的朋友请帮忙
我用的spring2.0+hibernate
数据库用的sql server 2005 字段SID设置为主键 自增

然后实体类对应的字段配置
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "SID", unique = true, nullable = false)
public Integer getSid() {
return this.sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}

插入数据成功 但是查看后台里面有 Dialect does not support identity key generation的错误
查找applicationContext.xml里有段
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>

我在网上查了下资料 别人都是使用的hbm.xml方式配置的 但是我是用的实体类来做的
现在已经蒙了。不知道怎么解决了。请高人指点一下

------解决方案--------------------
oracle不支持identity,支持的是sequence ,
@GeneratedValue(strategy = IDENTITY) 
修改成sequence
------解决方案--------------------
实体类是要映射


可hbm.xml方式配置也必不可少


2个配置文件干不一样的事
------解决方案--------------------
你这使用sqlservser,然后dialect使用oracle怎么可能对,
如果想使用oracle而且没有制定sequece的名字,则hibernate使用默认的名字HIBERNATE_SEQUENCE
你必须创建名为HIBERNATE_SEQUENCE 的sequence
------解决方案--------------------
呵呵,楼上几位说得对,你用oracle的方言去连接sql server,当然乱套了。

另外,即使方言配对了,如果不是项目有特别需要,id生成器没必要按数据库产品来配,直接用native,通用所有方言。这样有助于将来做数据库迁移,万一真有需要指定id的特殊生成器,到时候再改也不迟。

PS:如果数据量特别大,而且增删都特别频繁,数据库自动生成KEY是不太合适的,这时候建议自定义generator类,调用某存储过程按照特定逻辑来取得下一个id。