org.hibernate.dialect.OracleDialect不支持身份密钥生成 [英] org.hibernate.dialect.OracleDialect does not support identity key generation

查看:346
本文介绍了org.hibernate.dialect.OracleDialect不支持身份密钥生成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



 我试图导入一个示例项目到eclipse中,并且正在面对下面给出的运行应用程序的错误。 >引起:org.hibernate.MappingException:org.hibernate.dialect.OracleDialect不支持在org.hibernate.dialect.Dialect.getIdentityColumnString(Dialect.java:743)
的org.hibernate身份密钥生成
.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)
在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1782)
在org.springframew ork.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:247)
处org.springframework.orm org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:373)
。在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:358)
(AbstractAutowireCapableBeanFactory.java:1541)
。在org.springframework.beans.factory。 support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)
... 32 more

根据链接,我已更改



@GeneratedValue(strategy = GenerationType.IDENTITY)



to



@GeneratedValue(s trategy = 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)
私有字符串用户名;

@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: / p>

 <! - 会话工厂声明 - > 
< bean id =SessionFactory
class =org.springframework.orm.hibernate4.LocalSessionFactoryBean>
< property name =dataSourceref =DataSource/>
< property name =annotatedClasses>
< list>
< value> com.crud.model.User< / value>
< / list>
< / property>
< property name =hibernateProperties>
<道具>
< prop key =hibernate.dialect> org.hibernate.dialect.OracleDialect< / prop>
< prop key =hibernate.show_sql> true< / prop>
< prop key =hibernate.hbm2ddl.auto>建立< / prop>

< /道具>
< / property>
< / bean>


解决方案

您可以使用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数据库,则不能使用此配置,因为它们无法执行批量插入(没有进一步的配置),因为它们不支持序列。



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


I was trying to import a sample project in to eclipse and was facing the below given error up on running the application.

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

As per this SO link, I have changed the

@GeneratedValue(strategy = GenerationType.IDENTITY)

to

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

But didn't work.

Here is the code:

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;
    }

    }

From the 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>

解决方案

You can use tell Hibernate to use a sequence to generate your ID's

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

This config basically tells Hibernate to use a database sequence called ID_SEQ to generate the ID's for this object. You can specify other sequences on other objects if you want other unique ID's or you can use the same sequence if you want globally unique ID's across your entire system.

The only downside to this is that can't perform batch inserts (without some further config) because Hibernate needs to get the next sequence value from the database every time, and you can't use this config if you want to use a MySQL database, because they don't support sequences.

If any of that doesn't make sense let me know and I'll explain it further.

这篇关于org.hibernate.dialect.OracleDialect不支持身份密钥生成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆