2014-02-24 53 views
1

我学习Hibernate和得到这个错误:冬眠一对一的关系2

Hibernate: 
    insert 
    into 
     Profesor 
     (apMaterno, apPaterno, nombre) 
    values 
     (?, ?, ?) 
2014-02-24 10:05:05 WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper:145 - SQL Error: 1364, SQLState: HY000 
2014-02-24 10:05:05 ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper:147 - Field 'direccion' doesn't have a default value 
org.hibernate.exception.GenericJDBCException: could not execute statement 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2975) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3487) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:214) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:178) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752) 
    at com.gerrytan.pizzashop.PizzaDAO.testDAO(PizzaDAO.java:97) 
    at com.gerrytan.pizzashop.PizzaDAO$$FastClassByCGLIB$$bb484d55.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) 
    at com.gerrytan.pizzashop.PizzaDAO$$EnhancerByCGLIB$$3cb9e758.testDAO(<generated>) 
    at com.gerrytan.pizzashop.PizzaController.testUno(PizzaController.java:82) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    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:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: java.sql.SQLException: Field 'direccion' doesn't have a default value 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) 
    ... 66 more 

我的课PROFESOR:

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

    /** 
    * 
    */ 
    private static final long serialVersionUID = 3445708995899379632L; 
    @Id @GeneratedValue(strategy = GenerationType.AUTO) private int idProfesor; 
    @Column(name="nombre") private String nombre; 
    @Column(name="apMaterno") private String apMaterno; 
    @Column(name="apPaterno") private String apPaterno; 
    @OneToOne(cascade=CascadeType.ALL) @PrimaryKeyJoinColumn private Direccion direccion; 

我的课direccion:

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

    /** 
    * 
    */ 
    private static final long serialVersionUID = -480043084115314876L; 
    @Id @GeneratedValue(strategy = GenerationType.AUTO) private int idDireccion; 
    @Column(name="calle") private String calle; 
    @Column(name="numero") private String numero; 
    @Column(name="poblacion") private String pobalcion; 

显然每个类有你的getters和setter,我开始休眠,并没有太多的想法会导致这个错误或我失踪注释

更新

数据库MySQL中: enter image description here

更新2

try { 

      Direccion d = new Direccion(); 
      d.setCalle("1"); 
      d.setNumero("1"); 
      d.setPobalcion("1"); 

      Profesor p = new Profesor(); 
      p.setNombre("Victor"); 
      p.setApMaterno("as"); 
      p.setApPaterno("as"); 
      p.setIdDireccion(d); 


      Session session=sessionFactory.openSession(); 
      session.beginTransaction(); 
      session.save(p); 
      session.getTransaction().commit(); 
      session.close(); 



     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
+0

你使用MySQL吗?你是外键吗?我永远不会使用'@ PrimaryKeyJoinColumn',所以我建议试试这个:'@OneToOne @JoinColumn(name =“idDireccion”,unique = true,nullable = false,updatable = false private Direccion direccion;' – Athanor

+0

是的,我使用mysql和我只是更新我的代码与你的建议,并仍然有同样的问题 – vrvictor

+0

如果Profesor不能有Direccion对象,那么你可以尝试JoinColumn注解。@JoinColumn(name =“DIRECCION_ID”,nullable = true) – mstzn

回答

0

在OneToOne使用@PrimaryKeyJoinColumn意味着你要PROFESOR和Direccion共享相同的主键。

如果您确实想要这样做,那意味着Direccion还必须具有与Profesor实例的关联才能获取ID,并且您必须在ID字段上定义适当的策略。

在Direccion实体我想补充一个:

@OneToOne(mappedBy="direccion") 
private Profesor profesor; 

,并重新定义ID如下来强制Hibernate使用领域PROFESOR拿到ID:

@Id 
@GeneratedValue(generator = "foreignGenerator") 
@GenericGenerator(name = "foreignGenerator", strategy = "foreign", parameters = { @Parameter(name = "property", value = "profesor") }) 
private Integer idDireccion; 

你的代码示例还必须建立这两种方式的协会:

p.setDireccion(d); 
d.setProfesor(p); 

希望这会有所帮助。 Registers JF