org.hibernate.dialect.OracleDialect不支持身份密钥生成

我试图将一个示例项目导入到eclipse中,并且在运行应用程序时面临下面给出的错误。

Caused by: org.hibernate.MappingException: org.hibernate.dialect.OracleDialect does not support identity key generation at org.hibernate.dialect.Dialect.getIdentityColumnString(Dialect.java:743) at org.hibernate.dialect.Dialect.getIdentityColumnString(Dialect.java:733) at org.hibernate.mapping.Table.sqlCreateString(Table.java:426) at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:1028) at org.hibernate.tool.hbm2ddl.SchemaExport.(SchemaExport.java:125) at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:492) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1782) at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:247) at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:373) at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:358) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479) ... 32 more 

根据这个 SO链接,我改变了

@GeneratedValue(strategy = GenerationType.IDENTITY)

@GeneratedValue(strategy = GenerationType.AUTO)@GeneratedValue(strategy = GenerationType.TABLE)

但没有奏效。

这是代码:

User.java:

 @Entity @Table(name = "users") @ManagedBean @ViewScoped public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "username", nullable = false) private String username; @Column(name = "password", nullable = false) private String password; @Column(name = "role", nullable = false) private String role; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } } 

从applicationContext.xml:

      com.crud.model.User     org.hibernate.dialect.OracleDialect true create    

您可以使用tell Hibernate使用序列来生成您的ID

 @Id @Column(name = "ID") @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "id_Sequence") @SequenceGenerator(name = "id_Sequence", sequenceName = "ID_SEQ") private int id; 

此配置基本上告诉Hibernate使用名为ID_SEQ的数据库序列来生成此对象的ID。 如果您想要其他唯一ID,可以在其他对象上指定其他序列,或者如果您希望在整个系统中使用全局唯一ID,则可以使用相同的序列。

唯一的缺点是不能执行批量插入(没有一些进一步的配置),因为Hibernate每次都需要从数据库中获取下一个序列值,如果你想使用MySQL数据库就不能使用这个配置,因为他们不支持序列。

如果其中任何一个没有意义,请告诉我,我会进一步解释。

而不是IDENTITY使用NATIVE并使用它的序列。 链接

如果您只需要能够自动递增属性值(例如某些ID,即表的主键@GeneratedValue(strategy = GenerationType.TABLE)则可以使用@GeneratedValue(strategy = GenerationType.TABLE) 。 它对我有用。 希望能帮助到你。

我的声誉太低了……

好吧,我非常感谢JamesENL

我替换了

  @GeneratedValue(strategy = GenerationType.IDENTITY) 

通过

  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "id_Sequence") @SequenceGenerator(name = "id_Sequence", sequenceName = "ID_SEQ")` 

这很好