问题 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.<init>(SchemaExport.java:125)
    at org.hibernate.internal.SessionFactoryImpl.<init>(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:

<!-- Session Factory Declaration -->
<bean id="SessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="DataSource" />
    <property name="annotatedClasses">
        <list>
            <value>com.crud.model.User</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>

        </props>
    </property>
</bean>

10166
2018-06-03 07:08


起源

删除close方法声明 - JamesENL
你修好了吗? - JamesENL


答案:


您可以使用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数据库就不能使用这个配置,因为他们不支持序列。

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


16
2018-06-03 07:20



不知道为什么我再次得到同样的错误,即使我们没有使用 IDENTITY。我在用着 Oracle D B - NaaN
删除配置的hibernate.dialect行。 Hibernate将自动检测要使用的方言。我很确定OracleDialect适用于更老的oracle数据库。 - JamesENL
抛出, Connection cannot be null when 'hibernate.dialect' not set - NaaN
你能发帖吗? dataSource 宣言?该错误消息意味着Hibernate无法连接到您的数据库 - JamesENL
加入我们 - chat.stackoverflow.com/rooms/44929/... - JamesENL


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


0
2018-06-03 07:24





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


0
2017-10-03 08:28





我的声誉太低了......

好吧,我非常感谢JamesENL

我替换了

    @GeneratedValue(strategy = GenerationType.IDENTITY)

通过

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

这很好


0
2017-08-15 10:14