Java.sql.BatchUpdateException: Field doesn't have a default value

4 respostas
rafael.espiritosanto

Olá pessoal!

Estou tendo umas dificuldades em fazer o mapeamento de classes com as anotações do JPA.
Procurei em alguns fóruns e a "dica" para solução do problema se relaciona a recriação do banco. No entanto, esta solução não está servindo no meu caso.

A exceção que estou enfrentando é
12:43:03,777 WARN  [JDBCExceptionReporter] SQL Error: 1364, SQLState: HY000
12:43:03,778 ERROR [JDBCExceptionReporter] Field 'm_QuestoesSecundarias_id' doesn't have a default value
12:43:03,778 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
	at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1141)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	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:171)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
	at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504)
	at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101)
	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269)
	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89)
	at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1423)
	at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137)
	at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
	at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(ServerVMClientUserTransaction.java:162)
	at org.jboss.seam.transaction.UTTransaction.commit(UTTransaction.java:52)
	at org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:613)
	at org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:604)
	at org.jboss.seam.jsf.SeamPhaseListener.handleTransactionsAfterPhase(SeamPhaseListener.java:345)
	at org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:245)
	at org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:196)
	at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
	at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
	at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.BatchUpdateException: Field 'm_QuestoesSecundarias_id' doesn't have a default value
	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)
	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)
	at com.mysql.jdbc.jdbc2.optional.StatementWrapper.executeBatch(StatementWrapper.java:722)
	at org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:774)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 74 more
12:43:03,786 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@19b8546
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

Estou procurando trabalhar em um esquema de herança. Embora as classes filhas não tenham atributos extras, essa relação é para expressar algo conceitual definido anteriormente. Desta forma, existem algumas restrições quando a modificação da hierarquia das classes.

Eis as classes envolvidas.

A classe Objetivo de Pesquisa contem duas listas de Questões de Pesquisa, uma para questões Primárias e outra para questões secundárias
@Entity
@Name("objetivoPesquisa")
@AutoCreate
public class ObjetivoPesquisa implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8815814034856059355L;
	private Long id;
	private String analisar;
	private String comProposito;
	private String comRespeito;
	private String noContexto;
	private Problema m_Problema;
	private ObjetoEstudo m_ObjetoEstudo;
	
	private List<QuestaoPesquisa> m_QuestoesPrimarias;
	private List<QuestaoPesquisa> m_QuestoesSecundarias;
	
	@Id @GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}
	
	@Lob
	public String getAnalisar() {
		return analisar;
	}

	public void setAnalisar(String analisar) {
		this.analisar = analisar;
	}

	@Lob
	public String getComProposito() {
		return comProposito;
	}

	public void setComProposito(String comProposito) {
		this.comProposito = comProposito;
	}

	@Lob
	public String getComRespeito() {
		return comRespeito;
	}

	public void setComRespeito(String comRespeito) {
		this.comRespeito = comRespeito;
	}

	@Lob
	public String getNoContexto() {
		return noContexto;
	}

	public void setNoContexto(String noContexto) {
		this.noContexto = noContexto;
	}

	@OneToOne(cascade=CascadeType.ALL)
	public Problema getM_Problema() {
		return m_Problema;
	}

	public void setM_Problema(Problema mProblema) {
		m_Problema = mProblema;
	}
	
	@OneToOne(cascade=CascadeType.ALL)
	public ObjetoEstudo getM_ObjetoEstudo() {
		return m_ObjetoEstudo;
	}

	public void setM_ObjetoEstudo(ObjetoEstudo mObjetoEstudo) {
		m_ObjetoEstudo = mObjetoEstudo;
	}
	
	@OneToMany(cascade=CascadeType.ALL)
	public List<QuestaoPesquisa> getM_QuestoesPrimarias() {
		return m_QuestoesPrimarias;
	}

	public void setM_QuestoesPrimarias(List<QuestaoPesquisa> mQuestoesPrimarias) {
		m_QuestoesPrimarias = mQuestoesPrimarias;
	}
	
	@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	public List<QuestaoPesquisa> getM_QuestoesSecundarias() {
		return m_QuestoesSecundarias;
	}

	public void setM_QuestoesSecundarias(List<QuestaoPesquisa> mQuestoesSecundarias) {
		m_QuestoesSecundarias = mQuestoesSecundarias;
	}

	public ObjetivoPesquisa(){

	}
}
Já a classe Questão de Pesquisa serve como Super classe para Questões Primárias e Secundárias.
@Name("questaoPesquisa")
@AutoCreate
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class QuestaoPesquisa implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -2691100576912584069L;
	private Long id;
	private String descricao;
	private List<Controle> m_Controle;
	private StringBusca m_StringBusca;
	//private StringBusca m_StringBuscaAdaptada;
	private FocoQuestao m_FocoQuestao;
	private Hipotese m_HipoteseNula;
	private Hipotese m_HipoteseAlternativa;

	@Id @GeneratedValue
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Lob
	@Column(nullable=true)
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	@OneToMany(cascade=CascadeType.ALL)
	@Basic(optional=true)
	public List<Controle> getM_Controle() {
		return m_Controle;
	}
	
	public void setM_Controle(List<Controle> mControle) {
		m_Controle = mControle;
	}
	
	@OneToOne(cascade=CascadeType.ALL)
	public StringBusca getM_StringBusca() {
		return m_StringBusca;
	}

	public void setM_StringBusca(StringBusca mStringBusca) {
		m_StringBusca = mStringBusca;
	}
	
	/*
	public FocoQuestao getM_FocoQuestao() {
		return m_FocoQuestao;
	}

	public void setM_FocoQuestao(FocoQuestao mFocoQuestao) {
		m_FocoQuestao = mFocoQuestao;
	}*/
	/*@OneToOne(cascade=CascadeType.ALL)
	public StringBusca getM_StringBuscaAdaptada() {
		return m_StringBuscaAdaptada;
	}

	public void setM_StringBuscaAdaptada(StringBusca mStringBuscaAdaptada) {
		m_StringBuscaAdaptada = mStringBuscaAdaptada;
	}*/

	@OneToOne(cascade=CascadeType.ALL)
	@Basic(optional=true)
	public Hipotese getM_HipoteseNula() {
		return m_HipoteseNula;
	}

	public void setM_HipoteseNula(Hipotese mHipoteseNula) {
		m_HipoteseNula = mHipoteseNula;
	}
	
	@OneToOne(cascade=CascadeType.ALL)
	@Basic(optional=true)
	public Hipotese getM_HipoteseAlternativa() {
		return m_HipoteseAlternativa;
	}

	public void setM_HipoteseAlternativa(Hipotese mHipoteseAlternativa) {
		m_HipoteseAlternativa = mHipoteseAlternativa;
	}
	
	public String sugereTermosComBaseArtigosControle() {
		ModeloTermosRelevantes modeloTermosRelevantes = new ModeloTermosRelevantes();
		StringBuilder stringBuilder = new StringBuilder();
		List<Controle> artigosControle = this.getM_Controle();
		if (artigosControle != null) {
			for (Controle controle: this.m_Controle) {
				stringBuilder.append(controle.getConteudoAbstract() + "\n");
			}
			String termosRelevantes = modeloTermosRelevantes.sugereTermos(stringBuilder.toString());
		}
		
		//TODO: Trocar retorno do método!
		return "Sugestão de Termos";
	}
	
	public boolean contemArtigosControle() {
		return this.getM_Controle() != null && this.getM_Controle().size() > 0;
	}
	
	public QuestaoPesquisa(){

	}
	
	@Override
	public boolean equals(Object o) {
		QuestaoPesquisa q = (QuestaoPesquisa) o;
		return this.descricao.equals(q.getDescricao());
	}
}
Por fim, tanto questões primárias e secundárias não possuem atributos extras. Elas utilizam herança ao invés de composição por questões conceituais. Só estou colocando o código da Questão Secundária, uma vez que a Questão Primária é idêntica.
@Name("questaoSecundaria")
@AutoCreate
@Entity
public class QuestaoSecundaria extends QuestaoPesquisa {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1548642214127387416L;
	
	public QuestaoSecundaria(){

	}

}
Já recriei o banco mas o problema persiste. O que pode ser a causa para a exceção
Caused by: java.sql.BatchUpdateException: Field 'm_QuestoesSecundarias_id' doesn't have a default value

Valeu!!

4 Respostas

kicolobo

O que rola é o seguinte: um campo seu que está como not null está não está recebendo um valor pra ser preenchido.

Fácil de resolver: se houver um valor default padrão, basta adicioná-lo à estrutura do campo na tabela.

rafael.espiritosanto

Bom, é possível que seja isto, uma vez que em determinadas situações os atributos referentes a Controle e Comparison podem ser nulos. No mapeamento de classes, fiz algo deste jeito

@OneToMany(cascade=CascadeType.ALL) @Basic(optional=true) public List<Controle> getM_Controle() { return m_Controle; }

Já em outra situação, como o mapeamento é 1-1, fiz

@OneToOne(cascade=CascadeType.ALL, optional=true) public Comparison getM_Comparison() { return m_Comparison; }

No entanto, no primeiro trecho, o mapeamento é 1-N. Daí não sei se fiz o mapeamento correto para informar que tal relacionamento pode ser nulo. Esta correto?

Valeu!!

rafael.espiritosanto

Fiz as modificações que citei acima em todas as classes do projeto que possuiam relacionamento 1-1 ou 1-N e o problema persiste… :frowning:
Nenhuma outra dica?!?

rafael.espiritosanto

Eu fui analisar o script do banco gerado e reparei que o m_QuestoesSecundarias_id reportado na exceção está relacionado a tabela de relacionamento entre objetivo pesquisa e questão pesquisa.

CREATE TABLE `objetivopesquisa_questaopesquisa` ( `ObjetivoPesquisa_id` bigint(20) NOT NULL, `m_QuestoesSecundarias_id` bigint(20) NOT NULL, `m_QuestoesPrimarias_id` bigint(20) NOT NULL, UNIQUE KEY `m_QuestoesSecundarias_id` (`m_QuestoesSecundarias_id`), UNIQUE KEY `m_QuestoesPrimarias_id` (`m_QuestoesPrimarias_id`), KEY `FKDEE862B7711939B9` (`m_QuestoesPrimarias_id`), KEY `FKDEE862B7885145A9` (`ObjetivoPesquisa_id`), KEY `FKDEE862B7A8E93ECD` (`m_QuestoesSecundarias_id`), CONSTRAINT `FKDEE862B7711939B9` FOREIGN KEY (`m_QuestoesPrimarias_id`) REFERENCES `questaopesquisa` (`id`), CONSTRAINT `FKDEE862B7885145A9` FOREIGN KEY (`ObjetivoPesquisa_id`) REFERENCES `objetivopesquisa` (`id`), CONSTRAINT `FKDEE862B7A8E93ECD` FOREIGN KEY (`m_QuestoesSecundarias_id`) REFERENCES `questaopesquisa` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Em algumas situações, o campo m_QuestoesSecundarias_id pode ser nulo. Como posso informar que isto é possível?

Valeu!

Criado 2 de dezembro de 2010
Ultima resposta 4 de dez. de 2010
Respostas 4
Participantes 2