title: Hibernate is trying to insert an optional @OneToOne empty field
body: <p>Fellows,</p>
  
  <p>I'm facing an issue during hibernate storing with merge() method. Let me see if you can help me. Having said that, I'll post my code below.</p>
  
  <h1>1) DDL SQL</h1>
  
  <p>Here is the involved table defs (some columns were ommited because are only regular data):</p>
  
  <pre><code>TABLE proposta (
      idProposta INT(11) NOT NULL AUTO_INCREMENT,
      idBeneficio INT(11) NOT NULL,
      idTabela INT NULL,
      idOperacao INT NOT NULL,
      ...
  
  
  TABLE conta_bancaria (
      idContaBancaria INT NOT NULL AUTO_INCREMENT,
      idBanco INT NOT NULL,
      idProposta INT NOT NULL,
      idBeneficio INT NOT NULL,
      ...
  
  
  
  TABLE banco (
      idBanco INT(11) NOT NULL AUTO_INCREMENT,
      nmNomeBanco VARCHAR(60) NULL DEFAULT NULL,
      cdBanco VARCHAR(5) NULL DEFAULT NULL,
      nmNomeCompleto VARCHAR(90) NULL,
      dsSite VARCHAR(256) NULL,
      blAtivo INT NULL DEFAULT NULL,
      PRIMARY KEY (`idBanco`)
  </code></pre>
  
  <h1>2) Code</h1>
  
  <h2>2.1) Entity Mappings</h2>
  
  <pre><code>@Entity
  @Table(name="Proposta")
  public class Proposta extends GenericEntity&lt;Proposta&gt;{
  
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "idProposta")
      private Integer idProposta;
  
  
      @OneToOne(cascade = CascadeType.ALL, mappedBy="proposta", fetch = FetchType.LAZY, optional=true)
      @JoinColumn(name = "idProposta", referencedColumnName="idProposta")
      @Basic(optional=true)
      private ContaBancaria contaRecebimento;
  
      @ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
      @JoinColumn(name = "idBeneficio", referencedColumnName="idBeneficio")
      private Beneficio beneficio;
  
      @OneToOne(cascade=CascadeType.ALL)  
      @JoinColumn(name = "idOperacao", referencedColumnName="idOperacao")
      private Operacao operacao;
      ...
  
  
  
  @Entity
  @Table(name="Conta_Bancaria")
  public class ContaBancaria extends GenericEntity&lt;ContaBancaria&gt;{
  
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name = "idContaBancaria")
      private Integer idContaBancaria;
  
  
      @ManyToOne(cascade = CascadeType.ALL)
      @JoinColumn(name = "idBanco")
      private Banco banco;
  
      @OneToOne  
      @PrimaryKeyJoinColumn 
      private Proposta proposta;
  
      @OneToOne
      @PrimaryKeyJoinColumn
      private Beneficio beneficio;
      ...
  </code></pre>
  
  <h2>2.2) Controller</h2>
  
  <pre><code>@ManagedBean("propostaBean")
  @ViewScoped
  public class PropostaBean extends GenericController {
  
      @Inject
      private PropostaService propostaService; 
  
  
  /** Aba Cadastro Proposta **/
  private Pessoa pessoa;
  private Beneficio beneficio;
  private Proposta proposta;
  
  private List&lt;Banco&gt; bancos;
  private Integer idBancoSelected;
  
  private Integer idOperacaoSelected;
  private List&lt;Operacao&gt; operacoes;
  
  
  
  public PropostaBean() {
      refreshBean();
  }
  
  @PostConstruct
  private void refreshBean(){
      this.pessoa = new Pessoa();
      this.beneficio = new Beneficio();
      this.proposta = new Proposta();
      this.filtroBenProp = new FiltroBeneficioProposta();
      this.resultadoBuscaBeneficio = new ArrayList&lt;PessoaBeneficioDTO&gt;();
      this.bancos = new ArrayList&lt;Banco&gt;();
      this.operacoes = new ArrayList&lt;Operacao&gt;();
  }
  
  public String salvarProposta(){
      String method = "salvarProposta";
      long startTime = startMethod(method);
  
      Banco banco = null;
      for (Banco b : bancos) {
          if(b.getIdBanco() == idBancoSelected){
              banco = b;
          }
      }
  
      Operacao operacao = null;
      for (Operacao op : operacoes) {
          if(op.getIdOperacao() == idOperacaoSelected){
              operacao = op;
              this.proposta.setOperacao(operacao);
          }
      }
      System.out.println("Operacao = ["+operacao+"], idOperacaoSelected ["+idOperacaoSelected+"]");
      System.out.println("Conta Bancaria = ["+proposta.getContaRecebimento()+"]");
      this.proposta.setBeneficio(beneficio);
      try {
          if(proposta.getContaRecebimento().getAgencia() == null){
              proposta.setContaRecebimento(null);
          }
          this.proposta = propostaService.salvarProposta(proposta);
          proposta.setContaRecebimento(new ContaBancaria());
          FacesUIHelper.addSucessMessage("Proposta no ["+proposta.getNpi()+"] cadastrada com sucesso");
      } catch (BusinessException e) {
          e.printStackTrace();
          FacesUIHelper.addErrorMessage(e.getMessage());
      }
  
      leaveMethod(startTime, method);
      return "/views/cadastro/cadastroProposta";
  }
  }
  </code></pre>
  
  <h2>2.3) Service</h2>
  
  <pre><code>@Service("propostaService")
  @Transactional
  public class PropostaServiceImpl extends GenericServiceImpl&lt;Proposta&gt; implements Serializable, PropostaService {
  
  public static final String USUARIO_DEFAULT = "SYSTEM";
  
  @Inject
  private PropostaDAO&lt;Proposta&gt; propostaDAO;
  
  @Inject
  private OperacaoDAO&lt;Operacao&gt; operacaoDAO;
  
  @Inject
  private BeneficioDAO&lt;Beneficio&gt; beneficioDAO;
  
  @Inject
  private TipoOperacaoDAO&lt;TipoOperacao&gt; tipoOperacaoDAO;
  
  @Inject 
  private ParametroSistemaDAO&lt;ParametroSistema&gt; parametroSistemaDAO;
  
  @Override
  public Proposta salvarProposta(Proposta p) throws BusinessException {
      String method = "salvarProposta";
      long startTime = startMethod(method);
      Proposta prop = null;
      if(p.getIdProposta() == null){
          try {
              Integer npi = parametroSistemaDAO.getSequenceValue("SEQ_NPI");
              p.setNpi(npi);
              Date dt = new Date(System.currentTimeMillis());
              p.setDataProposta(dt);
              p.setDataStatus(dt);
              p.setStatus(Proposta.CADASTRADA);
              p.setUsuarioResponsavel(USUARIO_DEFAULT);
              prop = propostaDAO.saveOrUpdate(p);
          } catch (DAOException e) {
              throw new BusinessException(e);
          }
      }else {
          prop = propostaDAO.saveOrUpdate(p);
      }
      leaveMethod(startTime, method);
      return prop;
  }
  }
  </code></pre>
  
  <h2>2.4) DAO</h2>
  
  <pre><code>@Repository("genericDao")
  public abstract class GenericDAOImpl&lt;T&gt; implements GenericDAO&lt;T&gt; {
  
  protected static Logger logger;
  
  @PersistenceContext
  protected EntityManager entityManager;
  
  protected String className;
  private Class&lt; T &gt; type;
  
  public GenericDAOImpl() {
      Type t = getClass().getGenericSuperclass();
      ParameterizedType pt = (ParameterizedType) t;
      type = (Class) pt.getActualTypeArguments()[0];
      this.logger = LoggerFactory.getLogger(getClass());
      this.className = this.getClass().getName();
  }
  
  @Transactional
  public T save(T entity) throws DAOException {
      entityManager.persist(entity);
      return entity;
  }
  
  @Transactional
  public T update(T entity) {
      entityManager.merge(entity);
      return entity;
  }
  
  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public T saveOrUpdate(T entity){
      entityManager.merge(entity);
      return entity;
  }
  
  @Transactional
  public Collection&lt;T&gt; saveOrUpdateAll(Collection&lt;T&gt; entities) {
      for(T element: entities) {
          entityManager.merge(element);
      }
      return entities;
  }
  
  @Transactional
  public void delete(T entity) {
      entityManager.remove(entity);
  }
  
  @Transactional
  public void deleteAll(List&lt;T&gt; list) {
      for(T element: list) {
          entityManager.remove(element);
      }
  }
  
  @SuppressWarnings("unchecked")
  public List&lt;T&gt; listAll() {
      CriteriaBuilder cb = entityManager.getCriteriaBuilder();
      CriteriaQuery&lt;T&gt; c = cb.createQuery(type);
  
      Root&lt;T&gt; genericObject = c.from(type);
      TypedQuery&lt;T&gt; typedQuery = entityManager.createQuery(c);
  
      List&lt;T&gt; resultList = (List&lt;T&gt;) typedQuery.getResultList();
  
      return resultList;
  }
  
  public T findById(long id) {
      T result =(T) entityManager.find(type, id);
      return result;
  }
  
  public T findById(Serializable id) {
      T result =(T) entityManager.find(type, id);
      return result;
  }
  
  public EntityManager getEntityManager() {
      return entityManager;
  }
  
  public void setEntityManager(EntityManager entityManager) {
      this.entityManager = entityManager;
  }
  }
  </code></pre>
  
  <p>When I call merge for proposta instance (which is not created yet), even when I mark (or at least it supposed to be marked) Proposta.ContaBancaria as an optional relationship, hibernate tries to insert it also. Here it's hibernate logs:</p>
  
  <pre><code>04:47:33,410 INFO  [stdout] Hibernate: 
  04:47:33,410 INFO  [stdout]     insert 
  04:47:33,411 INFO  [stdout]     into
  04:47:33,411 INFO  [stdout]         Proposta
  04:47:33,411 INFO  [stdout]         (idBeneficio, dtEnvioFisico, dtPagamento,     dtPagamentoComissao, dtProposta, dtStatus, cdDocExterno, tpMeioPagamento, cdNpi, nrLinhasAtual, nrNumParcelas, idOperacao, status, nmUsuario, vlBrutoConsiderado, vlDescontos, vlLiquidoLiberado, vlLiquidoBeneficio, vlMargemLivre, vlValorParcela) 
  04:47:33,413 INFO  [stdout]     values
  04:47:33,413 INFO  [stdout]         (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  
  04:47:33,502 INFO  [stdout] Hibernate: 
  04:47:33,502 INFO  [stdout]     insert 
  04:47:33,502 INFO  [stdout]     into
  04:47:33,503 INFO  [stdout]         Conta_Bancaria
  04:47:33,503 INFO  [stdout]         (nrAgencia, blAtivo, idBanco, nrDigitoAgencia,     nrDigitoConta, nrConta, blPoupanca, nrTipo) 
  04:47:33,504 INFO  [stdout]     values
  04:47:33,504 INFO  [stdout]         (?, ?, ?, ?, ?, ?, ?, ?)
  </code></pre>
  
  <p>Then I get this error following:</p>
  
  <pre><code>04:47:33,552 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] SQL Error: 1048, SQLState: 23000
  04:47:33,553 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Column 'idBanco' cannot be null
  04:47:34,352 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] #{propostaBean.salvarProposta}: org.springframework.dao.DataIntegrityViolationException:   Column 'idBanco' cannot be null; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Column 'idBanco' cannot be null: javax.faces.FacesException: #{propostaBean.salvarProposta}: org.springframework.dao.DataIntegrityViolationException: Column 'idBanco' cannot be null; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Column 'idBanco' cannot be null
  at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
  at org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:45) [primefaces-4.0.jar:4.0]
  at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
  at javax.faces.component.UIData.broadcast(UIData.java:1093) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
  at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
  at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
  at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.7-jbossorg-2.jar:]
  at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
  at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
  at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
  at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98) [primefaces-4.0.jar:4.0]
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
  at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
  at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
  at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
  at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_21]
  Caused by: javax.faces.el.EvaluationException: org.springframework.dao.DataIntegrityViolationException: Column 'idBanco' cannot be null; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Column 'idBanco' cannot be null
  at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
  at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]
  ... 26 more
  
  Caused by: org.springframework.dao.DataIntegrityViolationException: Column 'idBanco' cannot be null; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Column 'idBanco' cannot be null
  at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:188) [spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:154) [spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) [spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at com.sun.proxy.$Proxy110.saveOrUpdate(Unknown Source)
  at br.com.centralemprestimos.sisat.service.PropostaServiceImpl.salvarProposta(PropostaServiceImpl.java:65) [classes:]
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_21]
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_21]
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_21]
  at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_21]
  at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at com.sun.proxy.$Proxy113.salvarProposta(Unknown Source)
  at br.com.centralemprestimos.sisat.mbean.PropostaBean.salvarProposta(PropostaBean.java:184) [classes:]
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_21]
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_21]
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_21]
  at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_21]
  at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]
  at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
  at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]
  at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
  ... 27 more
  
  Caused by: org.hibernate.exception.ConstraintViolationException: Column 'idBanco' cannot be null
  at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at com.sun.proxy.$Proxy78.executeUpdate(Unknown Source)
  at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:55) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2757) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3268) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:78) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:272) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:304) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:195) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:128) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.ejb.event.EJB3MergeEventListener.saveWithGeneratedId(EJB3MergeEventListener.java:71) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:422) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.mergeTransientEntity(DefaultMergeEventListener.java:342) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:304) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:259) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:790) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:774) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.spi.CascadingAction$6.cascade(CascadingAction.java:288) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:462) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.mergeTransientEntity(DefaultMergeEventListener.java:395) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:304) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:259) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:86) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:781) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:766) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:770) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:867) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_21]
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_21]
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_21]
  at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_21]
  at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:257) [spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at com.sun.proxy.$Proxy102.merge(Unknown Source)
  at br.com.mobinn.fmwk.persistence.GenericDAOImpl.saveOrUpdate(GenericDAOImpl.java:60) [classes:]
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_21]
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_21]
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_21]
  at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_21]
  at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) [spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  ... 59 more
  
  Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'idBanco' cannot be null
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.7.0_21]
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) [rt.jar:1.7.0_21]
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [rt.jar:1.7.0_21]
  at java.lang.reflect.Constructor.newInstance(Constructor.java:525) [rt.jar:1.7.0_21]
  at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.Util.getInstance(Util.java:386) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2460) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2377) [mysql-connector-java-5.1.26.jar:]
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2361) [mysql-connector-java-5.1.26.jar:]
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_21]
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_21]
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_21]
  at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_21]
  at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
  ... 106 more
  </code></pre>
  
  <p>But it shouldn't be inserting ContaBancaria because it's empty and optional. It's not null because it's being rendered in view, but all fields are empty as this print shows:</p>
  
  <pre><code>04:47:33,145 INFO  [stdout] Conta Bancaria = [ContaBancaria [idContaBancaria=null, agencia=, digitoAgencia=null, numeroConta=null, digitoConta=, tipo=null, poupanca=0, ativo=null]]
  </code></pre>
  
  <p>Is there any mapping errors ? What am I doing wrong ?</p>
  
  <p>Thanks in advance.</p>