[RESOLVIDO]Hibernate + Struts 2: Problema para persistir objetos com agregações NULL

1 resposta
R

Bom pessoal, o problema é o seguinte:

Em uma alteração de um setor (setor de uma empresa por exemplo), já existente no banco de dados, existe um momento em que o usuário
pode alterar o nome deste setor e o chefe do setor, o chefe deste setor pode ser escolhido dentro de uma selectbox que retorna todos os
funcionários pertencentes àquele setor. Ele altera sim o nome do setor e também o chefe do setor…o problema é quando eu quero deixar o
setor sem chefe.

Neste selectbox, que possui o emptyValue, quando o emptyValue é selecionado, solicito a atualização, e o erro que me é retornado é o seguinte:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.jm.beans.Usuario

Bean:

@Entity
@Table(name="setor")
public class Setor implements Serializable{
	private static final long serialVersionUID = -4147033917357122227L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_setor")
	private Integer idSetor;
	@Column(name="st_nome")
	private String nome;
	@Column(name="st_superior")
	private Integer superior;
	@OneToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="st_chefe")
	private Usuario chefe;
	@OneToMany(mappedBy="idUsuario",fetch=FetchType.LAZY)
	private List<Usuario> listaUsuario;
	@OneToMany(mappedBy="idOcorrencia",fetch=FetchType.LAZY)
	private List<Ocorrencia> listaOcor;
	
	//Getters e Setters
}

Minha JSP:

<%@taglib prefix="s" uri="/struts-tags"%>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<s:form id="formAlterarSetor" theme="simple" action="setor!alterarSetor">
	<table>
		<tr>
			<td>Setor:</td>
			<td colspan="2" align="left">
				<s:hidden id="idSetor" name="setor.idSetor"/>
				<s:hidden id="superior" name="setor.superior"/>
				<s:textfield id="nome" name="setor.nome" label="Setor"/>
			</td>
		</tr>
		<tr>
			<td>Chefe:</td>
			<td colspan="2" align="left">
				<s:if test="%{listaUsuarios.size<1}">
					Não  usuários neste setor.
				</s:if>
				<s:else>
					<s:select emptyOption="true" name="setor.chefe.idUsuario" value="%{setor.chefe.idUsuario}" list="listaUsuarios" listValue="nome" listKey="idUsuario"/>
				</s:else>
			</td>
		</tr>
		<tr>
			<td><sj:submit value="Alterar" formIds="formAlterarSetor" targets="divTabSetores" button="true" buttonIcon="ui-icon-gear"/></td>
			<td></td>
			<td>
				<s:url id="urlAddSub" action="setor!adicionarSubSetor?setor.idSetor=%{setor.idSetor}"/>
				<sj:a openDialog="popUpDialog" href="%{urlAddSub}" button="true" buttonIcon="ui-icon-gear">Adicionar Sub-setor</sj:a>
			</td>
		</tr>
	</table>
</s:form>

1 Resposta

R

Era besteira galera, bastava eu transformar o objeto Usuario chefe em null…

public void executeUpdate(Setor set){
	if(set.getChefe()!=null){
		if(set.getChefe().getIdUsuario()==null){
			set.setChefe(null);
		}
	}
	sdao.update(set);
}

Por algum motivo, o hibernate só entende que a chave estrangeira do id do chefe do setor deve ser nula,
quando o objeto chefe está nulo.

Besteira, mas me tomou um tempinho.=S

Criado 24 de abril de 2012
Ultima resposta 24 de abr. de 2012
Respostas 1
Participantes 1