2015-08-14 263 views
4

我試圖使用Oracle 12c標識列功能與Hibernate-5.0.0.CR4。我已經使用在春季啓動application.properties以下屬性:帶休眠的Oracle 12c標識列5

spring.jpa.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect 
spring.datasource.driverClassName=oracle.jdbc.OracleDriver 

Oracle12cDialectsource code,這似乎是它支持標識列。但我收到以下錯誤,而試圖將記錄插入一個名爲user_preferences表:

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

import org.hibernate.envers.Audited; 
import org.hibernate.envers.RelationTargetAuditMode; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

import lombok.Data; 

@Entity 
@Table(name = "user_preferences") 
@Data 
@JsonIgnoreProperties(value = { "prefId" }) 
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
public class UserPreference { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "pref_id") 
    private Long prefId; 

    @Column(nullable = false) 
    private String key; 

    @Column(nullable = false) 
    private String preference; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User user; 

    public UserPreference() { 
    } 

    public UserPreference(String key, String preference, User user) { 
     this.key = key; 
     this.preference = preference; 
     this.user = user; 
    } 

} 

例外,我得到

java.sql.SQLException: Invalid column type: getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor 
    at oracle.jdbc.driver.GeneratedAccessor.getLong(GeneratedAccessor.java:436) 
    at oracle.jdbc.driver.GeneratedStatement.getLong(GeneratedStatement.java:228) 
    at oracle.jdbc.driver.GeneratedScrollableResultSet.getLong(GeneratedScrollableResultSet.java:564) 
    at org.hibernate.id.IdentifierGeneratorHelper.get(IdentifierGeneratorHelper.java:113) 
    at org.hibernate.id.IdentifierGeneratorHelper.getGeneratedIdentity(IdentifierGeneratorHelper.java:73) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:88) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2730) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3300) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:474) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:179) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:163) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:198) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:317) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:272) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:178) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:109) 
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:774) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:747) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:752) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344) 
    at com.sun.proxy.$Proxy106.persist(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:291) 
    at com.sun.proxy.$Proxy106.persist(Unknown Source) 
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:433) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:436) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:421) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:393) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(RepositoryFactorySupport.java:506) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy117.save(Unknown Source) 
    at nl.yestelecom.phoenix.user.preference.UserPreferenceService.saveUserPreference(UserPreferenceService.java:45) 
    at nl.yestelecom.phoenix.controller.UserController.saveUserPreference(UserController.java:34) 

請讓我知道是否有辦法使用標識列而不使用數據庫序列。

回答

-1

你可以如下做到這一點:

CREATE TABLE identity_test_tab( ID號產生的默認身份, 說明VARCHAR2(30) );

SQL> INSERT INTO identity_test_tab(描述)VALUES('Just DESCRIPTION');

1 row created。 SQL> INSERT INTO identity_test_tab(id,description)VALUES(999,'ID = 999 and DESCRIPTION');

1 row created。 SQL> INSERT INTO identity_test_tab(id,description)VALUES(NULL,'ID = NULL and DESCRIPTION'); (ID,NULL和描述) * 錯誤在第1行: ORA-01400:無法將NULL插入(「TEST」。「IDENTITY_TEST_TAB」。「ID」 )

因爲總是標識列應該有值不爲空

+1

我的問題是我應該怎麼使用Hibernate做到這一點。一般來說,我非常熟悉如何使用oracle Identity列類型。 –

0

似乎休眠5.0.X做了查詢嘗試,當你指定GenerationType.IDENTITY來從數據庫中獲取的ID值。根據您用於聲明ID的類型,使用適當的getXXX從java ResultSet中檢索此值。 ResultSet.getString(columnIndex)或resultSet.getRowId(columnIndex)在我的情況下工作,但RowId不能在JPA bean中使用。

如果您嘗試改變其ID字符串它應該工作,雖然它看起來像一個bug對我說:

@Id 
@Column(name="PRD_ID") 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private String prdId;