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)

to

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

    }

Из приложенияContext.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>

Ответ 1

Вы можете использовать команду "Спящий режим" для использования последовательности для генерации идентификаторов вашего идентификатора

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

Эта конфигурация в основном сообщает Hibernate использовать последовательность базы данных с именем ID_SEQ для генерации идентификатора для этого объекта. Вы можете указать другие последовательности на других объектах, если хотите другой уникальный идентификатор, или вы можете использовать одну и ту же последовательность, если хотите глобально уникальный идентификатор всей системы.

Единственным недостатком этого является то, что не может выполнять пакетные вставки (без дополнительной настройки), потому что Hibernate должен каждый раз получать следующее значение последовательности из базы данных, и вы не можете использовать этот конфиг, если хотите использовать базы данных MySQL, поскольку они не поддерживают последовательности.

Если это не имеет смысла, дайте мне знать, и я объясню это дальше.

Ответ 2

Вы можете просто использовать @GeneratedValue(strategy = GenerationType.TABLE), если вам просто нужно иметь возможность автоматически увеличивать значение для таких атрибутов, как некоторый идентификатор, который является первичным ключом вашей таблицы. Это сработало для меня. Надеюсь, поможет.

Ответ 3

моя репутация слишком низкая...

Ну, я очень благодарен Джеймсен

Я заменил

    @GeneratedValue(strategy = GenerationType.IDENTITY)

от

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

и это прекрасно работает

Ответ 4

Вместо IDENTITY используйте NATIVE и используйте с ним последовательность. Ссылка

Ответ 5

Причина исключения:

Hibernate ожидает от базовой базы данных функции автоинкремента для данного свойства, в вашем случае это id. Итак, Oracle (ваш случай) должен поддерживать функцию автоматического увеличения поля. Oracle начала предоставлять функцию автоматического увеличения с 12c версией, и, поскольку ваша версия была меньше, вы получили это исключение.