2011-05-03 46 views
3

我只是在實體上添加一個新列,並且發生了一件奇怪的事情。Hibernate + Oracle,原始類型奇怪的空約束衝突

實體以前:

int publishedDayNb; 


public int getPublishedDayNb() { 
    return publishedDayNb; 
} 

public void setPublishedDayNb(int publishedDayNb) { 
    this.publishedDayNb = publishedDayNb; 
} 

而現在的實體是:

int publishedDayNb; 
int publishedDayNbSinceLastPublication; 


public int getPublishedDayNb() { 
    return publishedDayNb; 
} 

public void setPublishedDayNb(int publishedDayNb) { 
    this.publishedDayNb = publishedDayNb; 
} 

@Column(name="published_days_since_last_pub") 
public int getPublishedDayNbSinceLastPublication() { 
    return publishedDayNbSinceLastPublication; 
} 

public void setPublishedDayNbSinceLastPublication(int publishedDayNbSinceLastPublication) { 
    this.publishedDayNbSinceLastPublication = publishedDayNbSinceLastPublication; 
} 

正如你可以看到我剛剛添加的列。

SQL腳本做,在數據庫是:

alter table mytable add published_days_since_last_pub number(10,0); 
update mytable set published_days_since_last_pub=0; 
alter table mytable modify published_days_since_last_pub number(10,0) not null; 

我做一個java批量處理,讀取文件,插入新實體的條目,並更新現有的。

它可以在本地和開發服務器罰款,但在驗證服務器,我有一個新的實體處理過程中此錯誤(插入)

BATCH 03/05/2011 06:41:11 WARN [JDBCExceptionReporter.java:77] - SQL Error: 1400, SQLState: 23000 BATCH 03/05/2011 06:41:11 ERROR [JDBCExceptionReporter.java:78] - ORA-01400: cannot insert NULL into ("mydb"."mytable"."PUBLISHED_DAYS_SINCE_LAST_PUB")

BATCH 03/05/2011 06:41:11 ERROR [AbstractFlushingEventListener.java:301] - Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: could not insert: [com.xxx.myentity] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2262) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2655) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1001) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:339) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635) at com.xxx.eplatform.websites.webstore.batch.processor.DistrinetDataProcessor$$EnhancerByCGLIB$$42d43018.processDistrinetLine() at com.xxx.eplatform.websites.webstore.batch.services.impl.WebstoreImporterServiceImpl.importDistrinetFile(WebstoreImporterServiceImpl.java:71) at com.xxx.eplatform.websites.webstore.batch.WebstoreImportBatch.execute(WebstoreImportBatch.java:142) at com.xxx.eplatform.websites.webstore.batch.WebstoreImportBatch.main(WebstoreImportBatch.java:104) Caused by: java.sql.SQLException: ORA-01400: cannot insert NULL into ("mydb"."mytable"."PUBLISHED_DAYS_SINCE_LAST_PUB")

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216) at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:966) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3423) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242) ... 21 more

我不明白什麼是由於錯誤的我添加到實體的原始類型總是初始化爲0,因此它不應該爲空。

我也看着我的實體類與javap,它似乎是正確的版本的實體:我的新屬性是在那裏。

有人嗎?謝謝

+2

前後的實體代碼看起來對我來說是一樣的。我錯過了什麼,或者你粘貼了兩次相同的代碼? – Jberg 2011-05-03 17:03:05

+0

對不起,我編輯它 – 2011-05-03 20:39:43

+0

「驗證服務器」是否在兩者之間重新啓動? (我的意思是你的應用程序運行在它上面) – 2011-05-03 20:42:29

回答

-1

只是改變INT爲整數,看看它是否有幫助

+0

實際上,我想要在db中的約束,所以添加一個nullable = false與一個整數,或一個基元類型應該做同樣的事情。無論如何,這件事似乎已經消失 – 2011-05-05 15:37:21