2015-09-12 112 views
1

我正在使用Hibernate將對象保存在數據庫中。我使用@GeneratedValue註解生成我的主鍵。主鍵Hibernate @GeneratedValue null錯誤

這裏是我的代碼供應商類別

package com.samples.vendor; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.persistence.Transient; 


@Entity 
@Table(name = "Vendor") 
public class Vendor implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) 
    @Column(name="vendor_ID", unique = true, nullable = false) 
    private int vendor_ID; 
    private String vname; 
    private long phone_no; 
    private String emailID; 
    @Transient 
    private int updated; 


    public int getVendor_ID() { 
     return vendor_ID; 
    } 
    public void setVendor_ID(int vendor_ID) { 
     this.vendor_ID = vendor_ID; 
    } 
    public String getVname() { 
     return vname; 
    } 
    public void setVname(String vname) { 
     this.vname = vname; 
    } 
    public long getPhone_no() { 
     return phone_no; 
    } 
    public void setPhone_no(long phone_no) { 
     this.phone_no = phone_no; 
    } 
    public String getEmailID() { 
     return emailID; 
    } 
    public void setEmailID(String emailID) { 
     this.emailID = emailID; 
    } 
    public int getUpdated() { 
     return updated; 
    } 
    public void setUpdated(int updated) { 
     this.updated = updated; 
    } 

    } 

我使用MS SQL Server 2012中,我有一個供應商表,下面列

vendor_ID int   Unchecked -------> Primary key 
vname  varchar(50) Checked 
phone_no bigint  Checked 
emailID  varchar(50) Checked 
updated  bit   Checked 

未選中意味着它的NOTNULL = TRUE,它不容許空值。

這裏是我試圖將數據保存到數據庫中的代碼。

@RequestMapping(value = "addVendor", method = RequestMethod.POST) 
public ModelAndView addVendor(@ModelAttribute("vendor") Vendor vendor, BindingResult result) 
{ 
    if(result.hasErrors()) 
    { 
     ModelAndView modelErr = new ModelAndView("AddVendor"); 
     return modelErr; 
    } 
    Session session = null; 
    try 
    { 

     SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
     session = sessionFactory.openSession(); 
     session.beginTransaction(); 
     session.save(vendor); 
     session.getTransaction().commit(); 

     ModelAndView modelview = new ModelAndView("Insert"); 
     return modelview; 

    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
    finally 
    { 
     session.close(); 
    } 
    return null; 

當我運行它,我得到以下錯誤

Hibernate: insert into Vendor (emailID, phone_no, vname) values (?, ?, ?) 
Sep 12, 2015 7:45:53 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 515, SQLState: 23000 
Sep 12, 2015 7:45:53 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: Cannot insert the value NULL into column 'vendor_ID', table 'VendorCalls.dbo.Vendor'; column does not allow nulls. INSERT fails. 
org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:112) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:84) 
    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.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:678) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:670) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:665) 
    at com.samples.vendor.InsertDB.addVendor(InsertDB.java:39) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'vendor_ID', table 'VendorCalls.dbo.Vendor'; column does not allow nulls. INSERT fails. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) 
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:314) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204) 
    ... 59 more 

請幫助我。我是新來的冬眠,並試圖學習它。先謝謝你。

回答

1

如果您爲@GeneratedValue使用策略javax.persistence.GenerationType.IDENTITY,則您的表必須具有標識生成器。這可以包括一個AUTO_INCREMENT到主鍵。

實施例: CREATE TABLE賣方 ( ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(ID) )

+0

當我們使用@GeneratedValue註解時,hibernate是否不生成標識值? 我的理解是,我可以將我的數據庫中的列更改爲IDENTITY,並可以取消AUTO_INCREMENT的權利? – Venky

+0

不一定,只是嘗試了一個實體(strategy = GenerationType.IDENTITY),它的表沒有AUTO_INCREMENT。 Hibernate返回了一個錯誤,說實體沒有錯誤默認值爲它的ID。包括AUTO_INCREMENT後,所有工作都正常。 – Bonifacio

1

vendor_ID你沒有默認值,但它有NOT NULL約束。當你在做INSERT時,你必須設置vendor_ID,或者如果你不想手動設置它,那麼你應該設置AUTO_INCREMENT屬性來爲新行生成一個唯一的標識。請記住,如果您沒有爲您的id字段設置任何值,則應將其設置爲空值或默認值(或者,如果您設置了該屬性,它將執行自動增量)。

@GeneratedValue註釋只是告訴Hibernate數據庫本身正在生成這個值。所以AUTO_INCREMENT也應該在數據庫中定義。

+0

它的工作。我唯一需要做的就是爲該列添加標識。謝謝 – Venky

0

我不知道Hibernate ORM是否已經更新了很多,但是如果你使用@GeneratedValue,你現在必須省略裝飾器@Column()

所以,你的代碼將是

@Id 
@GeneratedValue 
private int vendor_ID; 

代替

@Id 
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) 
@Column(name="vendor_ID", unique = true, nullable = false) 
private int vendor_ID; 

希望它能幫助。

相關問題