Hibernate试图插入一个可选的@OneToOne空字段

时间:2014-03-14 08:32:43

标签: java mysql spring hibernate one-to-one

研究员,

我在使用merge()方法存储hibernate时遇到了问题。让我看看你是否可以帮助我。话虽如此,我会在下面发布我的代码。

1)DDL SQL

以下是涉及的表defs(由于只是常规数据,因此省略了一些列):

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`)

2)代码

2.1)实体映射

@Entity
@Table(name="Proposta")
public class Proposta extends GenericEntity<Proposta>{

    @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<ContaBancaria>{

    @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;
    ...

2.2)控制器

@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<Banco> bancos;
private Integer idBancoSelected;

private Integer idOperacaoSelected;
private List<Operacao> 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<PessoaBeneficioDTO>();
    this.bancos = new ArrayList<Banco>();
    this.operacoes = new ArrayList<Operacao>();
}

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";
}
}

2.3)服务

@Service("propostaService")
@Transactional
public class PropostaServiceImpl extends GenericServiceImpl<Proposta> implements Serializable, PropostaService {

public static final String USUARIO_DEFAULT = "SYSTEM";

@Inject
private PropostaDAO<Proposta> propostaDAO;

@Inject
private OperacaoDAO<Operacao> operacaoDAO;

@Inject
private BeneficioDAO<Beneficio> beneficioDAO;

@Inject
private TipoOperacaoDAO<TipoOperacao> tipoOperacaoDAO;

@Inject 
private ParametroSistemaDAO<ParametroSistema> 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;
}
}

2.4)DAO

@Repository("genericDao")
public abstract class GenericDAOImpl<T> implements GenericDAO<T> {

protected static Logger logger;

@PersistenceContext
protected EntityManager entityManager;

protected String className;
private Class< T > 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<T> saveOrUpdateAll(Collection<T> entities) {
    for(T element: entities) {
        entityManager.merge(element);
    }
    return entities;
}

@Transactional
public void delete(T entity) {
    entityManager.remove(entity);
}

@Transactional
public void deleteAll(List<T> list) {
    for(T element: list) {
        entityManager.remove(element);
    }
}

@SuppressWarnings("unchecked")
public List<T> listAll() {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<T> c = cb.createQuery(type);

    Root<T> genericObject = c.from(type);
    TypedQuery<T> typedQuery = entityManager.createQuery(c);

    List<T> resultList = (List<T>) 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;
}
}

当我为proposta实例(尚未创建)调用merge时,即使我标记(或至少它应该被标记)Proposta.ContaBancaria作为可选关系,hibernate也尝试插入它。这是hibernate日志:

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]         (?, ?, ?, ?, ?, ?, ?, ?)

然后我收到以下错误:

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

但它不应该插入ContaBancaria,因为它是空的和可选的。它不是null,因为它在视图中呈现,但所有字段都是空的,因为此打印显示:

04:47:33,145 INFO  [stdout] Conta Bancaria = [ContaBancaria [idContaBancaria=null, agencia=, digitoAgencia=null, numeroConta=null, digitoConta=, tipo=null, poupanca=0, ativo=null]]

是否有任何映射错误?我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在映射中,您使用值Cascade.All指定了属性级联,这意味着在插入/更新/删除父实体Proposta时,必须以级联方式插入/更新/删除ContaBancaria。设置为“true”的可选属性意味着在插入或更新时Proposta中的ContaBancaria字段可以为null,但鉴于在您的情况下ContaBancaria不为null(但为空),hibernate理解有一个对象(非null)要插入在级联。