Problema Vraptor + Hibernate

19 respostas
bruno_r_santana

Olá pessoal,

Tenho que entregar um projeto da facul daqui poucos dias, então me ajudem rápido por favor =)

O projeto é um sistema que irá permitir que o usuário monte um carro escolhendo o modelo, quais kits e acessórios o carro vai ter, etc. Um kit pode ter diversos acessórios. Quando o cliente monta o carro do jeito que ele quer a configuração que ele escolheu é gravada na tabela configuracao.

Portanto a tabela kit tem uma chave primária e a chave estrangeira fica na tabela de configuracao_kit. O relacionamento é muitos para muitos, um kit pode estar presente em muitas configurações e uma configuração pode ter muitos kits.

Bom, tenho que listar todos kits em uma jsp sendo que cada kit é representado por um checkbox. Na hora de gravar o kit ao invés de apenas dar um insert em configuracao_kit o hibernate está fazendo coisas a mais como dar um update na tabela kit e um delete na tabela kit_acessorio:

Hibernate: insert into configuracao (FK_cliente, FK_veiculo) values (?, ?) //AQUI OK, ASSOCIOU UM CLIENTE E UM VEÍCULO A ESSA CONFIGURAÇÃO
Hibernate: update kit set descricao=?, kit=?, preco=? where PK_id_kit=?
Hibernate: delete from kit_acessorio where FK_kit=?
Hibernate: insert into configuracao_kit (FK_configuracao, FK_kit) values (?, ?)

Antes de gravar a configuração as tabelas estavam assim:

mysql> select * from kit;

±----------±-----------±------±-------+

| PK_id_kit | descricao  | kit   | preco  |

±----------±-----------±------±-------+

|         1 | kit 1 desc | kit 1 | 500.00 |

|         2 | kit 2 desc | kit 2 | 500.00 |

±----------±-----------±------±-------+

2 rows in set (0.00 sec)
mysql> select * from configuracao;

±-------------------±-----------±-----------+

| PK_id_configuracao | FK_cliente | FK_veiculo |

±-------------------±-----------±-----------+

|                  1 |       NULL |          1 |

|                  2 |       NULL |          2 |

|                  3 |       NULL |          1 |

|                  4 |       NULL |          2 |

|                  5 |       NULL |          2 |

|                  6 |       NULL |          2 |

±-------------------±-----------±-----------+

6 rows in set (0.00 sec)
mysql> select * from configuracao_kit;

±----------------±-------+

| FK_configuracao | FK_kit |

±----------------±-------+

|               4 |      1 |

|               6 |      1 |

|               6 |      2 |

±----------------±-------+

3 rows in set (0.00 sec)

Depois de gravar a configuração ficaram assim as tabelas:

mysql> select * from kit;

±----------±-----------±------±-------+

| PK_id_kit | descricao  | kit   | preco  |

±----------±-----------±------±-------+

|         1 | NULL       | NULL  |   NULL |

|         2 | kit 2 desc | kit 2 | 500.00 |

±----------±-----------±------±-------+

2 rows in set (0.00 sec)
mysql> select * from configuracao;

±-------------------±-----------±-----------+

| PK_id_configuracao | FK_cliente | FK_veiculo |

±-------------------±-----------±-----------+

|                  1 |       NULL |          1 |

|                  2 |       NULL |          2 |

|                  3 |       NULL |          1 |

|                  4 |       NULL |          2 |

|                  5 |       NULL |          2 |

|                  6 |       NULL |          2 |

|                  7 |       NULL |          2 |

±-------------------±-----------±-----------+

7 rows in set (0.00 sec)
mysql> select * from configuracao_kit;

±----------------±-------+

| FK_configuracao | FK_kit |

±----------------±-------+

|               4 |      1 |

|               6 |      1 |

|               6 |      2 |

|               7 |      1 |

±----------------±-------+

4 rows in set (0.00 sec)

Vejam que o Hibernate criou e salvou a configuração de id 7 na tabela configuracao, criou a associação da configuração 7 com o kit 1 na tabela configuracao_kit, porém ele também deu um update setando tudo como NULL na tabela kit que é o que eu não queria.

19 Respostas

bruno_r_santana

Estou usando Vraptor e minha view (no browser acesso ela por /configuracao/montagem que mostra o arquivo montagem.jsp) está assim:

<%@ include file="../../header.jsp"%>

<form action="<c:url value="/configuracao/incluir"/>" name="incluirForm"
	method="post">
	<fieldset>
		<legend>Montar configuração</legend>

		<table>
			<tr>
				<td><label for="veiculo">Veiculo</label></td>
			</tr>
			
			<tr>
				<td>
					<select name="configuracao.veiculo.id_veiculo">
						<c:forEach var="veiculo" items="${veiculos}">
						<option value="${veiculo.id_veiculo}">${veiculo.modelo}</option>
						</c:forEach>
					</select>
				</td>
			</tr>
			
			<tr><td>&nbsp;</td></tr>
			<tr><td>Kits</td></tr>
			<c:forEach var="kit" items="${kits}" varStatus="status">
				<tr>    
           			<td><input type="checkbox" name="configuracao[${status.index}].kits.id_kit" value="${kit.id_kit}" /> ${kit.kit}</td>    
         		</tr> 
			</c:forEach>
			
			<tr><td>&nbsp;</td></tr>
			<tr>
				<td><button type="submit" id="submit">Salvar configuração</button></td>
			</tr>
		</table>

	</fieldset>
</form>

<%@ include file="../../footer.jsp"%>
bruno_r_santana

Já tentei usar assim também mas o resultado é o mesmo:

${kit.kit}

Classe de configuração:

package br.com.senac.pi4.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "configuracao")
public class Configuracao {
	private int id_configuracao;
	private Veiculo veiculo;
	private List<Kit> kits;
	private List<Acessorio> acessorios;
	private Cliente cliente;

	public Configuracao(Veiculo veiculo, List<Kit> kits, List<Acessorio> acessorios, Cliente cliente){
		this.veiculo = veiculo;
		this.kits = kits;
		this.acessorios = acessorios;
		this.cliente = cliente;
	}
	
	public Configuracao(){
	}
	
	@Id
	@GeneratedValue
	@Column(name = "PK_id_configuracao", unique = true, nullable = false)
	public int getId_configuracao() {
		return id_configuracao;
	}

	public void setId_configuracao(int id_configuracao) {
		this.id_configuracao = id_configuracao;
	}

	@ManyToOne
	@JoinColumn(name = "FK_veiculo")
	public Veiculo getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
	}
	
	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "configuracao_kit", joinColumns = { 
			@JoinColumn(name = "FK_configuracao", nullable = false, updatable = false) }, 
			inverseJoinColumns = { @JoinColumn(name = "FK_kit", 
					nullable = false, updatable = false) })
	public List<Kit> getKits() {
		return kits;
	}

	public void setKits(List<Kit> kits) {
		this.kits = kits;
	}

	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "configuracao_acessorio", joinColumns = { 
			@JoinColumn(name = "FK_configuracao", nullable = false, updatable = false) }, 
			inverseJoinColumns = { @JoinColumn(name = "FK_acessorio", 
					nullable = false, updatable = false) })
	public List<Acessorio> getAcessorios() {
		return acessorios;
	}

	public void setAcessorios(List<Acessorio> acessorios) {
		this.acessorios = acessorios;
	}
	
	@ManyToOne
	@JoinColumn(name = "FK_cliente")
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
}

ConfiguracaoController:

package br.com.senac.pi4.controller;

import java.util.List;

import org.hibernate.Session;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.senac.pi4.dao.DAOFactory;
import br.com.senac.pi4.model.Acessorio;
import br.com.senac.pi4.model.Cliente;
import br.com.senac.pi4.model.Configuracao;
import br.com.senac.pi4.model.Kit;
import br.com.senac.pi4.model.Veiculo;

@Resource
public class ConfiguracaoController {
	private DAOFactory daoFactory;
	private Result result;
	private Session sessao;

	public ConfiguracaoController(DAOFactory daoFactory, Result result, Session sessao)
	{
		this.daoFactory = daoFactory;
		this.result = result;
		this.sessao = sessao;
	}

	@Get
	@Path("/configuracao/montagem")
	public void montagem()
	{

		Cliente cliente = daoFactory.getClienteDAO().procurarPorId(1);
		result.include("cliente", cliente);
		
		List<Veiculo> veiculos = daoFactory.getVeiculoDAO().listarTodos();
		result.include("veiculos", veiculos);
		
		List<Kit> kits = daoFactory.getKitDAO().listarTodos();
		result.include("kits", kits);
		
		List<Acessorio> acessorios = daoFactory.getAcessorioDAO().listarTodos();
		result.include("acessorios", acessorios);
		
	}

	@Post
	@Path("/configuracao/incluir")
	public void incluir(Configuracao configuracao)
	{
		if (configuracao != null)
		{
			daoFactory.getConfiguracaoDAO().inserir(configuracao);
			System.out.println("Incluindo configuracao...");
		}
		System.out.println("Redirecionando...");
		result.redirectTo(this.getClass()).montagem();
	}
}
Lucas_Cavalcanti

o certo eh configuracao.kits[${status.index}].id_kit, se o kit tem o metodo setId_kit(…)

bruno_r_santana

Alterei o código e ficou assim:

<tr><td>Kits</td></tr>
			<c:forEach var="kit" items="${kits}" varStatus="status">
				<tr>    
           			<td><input type="checkbox" name="configuracao.kits[${status.index}}].id_kit" value="${kit.id_kit}" /> ${kit.kit}</td>    
         		</tr> 
			</c:forEach>

Ainda não deu certo. Antes de gravar a configuração:

mysql> select * from kit;
+-----------+------------+-------+--------+
| PK_id_kit | descricao | kit | preco |
+-----------+------------+-------+--------+
| 2 | kit 2 desc | kit 2 | 500.00 |
+-----------+------------+-------+--------+
1 row in set (0.02 sec)

mysql> select * from configuracao;
Empty set (0.00 sec)

mysql> select * from configuracao_kit;
Empty set (0.00 sec)

Depois de gravar a configuração:

mysql> select * from kit;
+-----------+------------+-------+--------+
| PK_id_kit | descricao | kit | preco |
+-----------+------------+-------+--------+
| 2 | kit 2 desc | kit 2 | 500.00 |
+-----------+------------+-------+--------+
1 row in set (0.00 sec)

mysql> select * from configuracao;
+--------------------+------------+------------+
| PK_id_configuracao | FK_cliente | FK_veiculo |
+--------------------+------------+------------+
| 1 | NULL | 1 |
+--------------------+------------+------------+
1 row in set (0.00 sec)

mysql> select * from configuracao_kit;
Empty set (0.00 sec)

Dessa vez não gravou nada na tabela configuracao_kit, não foi feita associação entre a configuração e o kit, apenas entre a configuração e o veículo, vide log:

Hibernate: insert into configuracao (FK_cliente, FK_veiculo) values (?, ?)

Minha classe Kit(que vira tabela kit) está assim:

package br.com.senac.pi4.model;

import java.math.BigDecimal;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "kit")
public class Kit {
	private int id_kit;
	private String kit;
	private String descricao;
	private BigDecimal preco;
	private List<Acessorio> acessorios;
	private List<Configuracao> configuracoes;
	
	public Kit(String kit, String descricao, BigDecimal preco, List<Acessorio> acessorios){	
		this.kit = kit;
		this.descricao = descricao;
		this.preco = preco;
		this.acessorios = acessorios;
	}
	
	public Kit(){	
	}
	
	@Id
	@GeneratedValue
	@Column(name = "PK_id_kit", unique = true, nullable = false)
	public int getId_kit() {
		return id_kit;
	}
	public void setId_kit(int id_kit) {
		this.id_kit = id_kit;
	}
	public String getKit() {
		return kit;
	}
	public void setKit(String kit) {
		this.kit = kit;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public BigDecimal getPreco() {
		return preco;
	}
	public void setPreco(BigDecimal preco) {
		this.preco = preco;
	}
	
	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "kit_acessorio", joinColumns = { 
			@JoinColumn(name = "FK_kit", nullable = false, updatable = false) }, 
			inverseJoinColumns = { @JoinColumn(name = "FK_acessorio", 
					nullable = false, updatable = false) })
	public List<Acessorio> getAcessorios() {
		return acessorios;
	}
	public void setAcessorios(List<Acessorio> acessorios) {
		this.acessorios = acessorios;
	}
	
	@ManyToMany(fetch = FetchType.LAZY, mappedBy = "kits")
	public List<Configuracao> getConfiguracoes() {
		return configuracoes;
	}
	public void setConfiguracoes(List<Configuracao> configuracoes) {
		this.configuracoes = configuracoes;
	}	
}

O que faço?

Obrigado.

bruno_r_santana

Até eu estava me confundindo, mas testei melhor com todas possibilidades que consegui imaginar e os resultados são esses:

Quando uso qualquer um desses:

${kit.kit} ${kit.kit} ${kit.kit}

Não gera registro na tabela configuracao_kit e não dá update ou delete em nenhuma tabela:
Hibernate: insert into configuracao (FK_cliente, FK_veiculo) values (?, ?)


Quando uso assim:

${kit.kit}

Gera um registro na tabela configuracao_kit que é o que eu quero mas ocorre um update e um delete indesejados:
Hibernate: insert into configuracao (FK_cliente, FK_veiculo) values (?, ?)
Hibernate: update kit set descricao=?, kit=?, preco=? where PK_id_kit=?
Hibernate: delete from kit_acessorio where FK_kit=?
Hibernate: insert into configuracao_kit (FK_configuracao, FK_kit) values (?, ?)

Alguma ajuda?

Obrigado.

bruno_r_santana

Só para poderem me ajudar melhor, o método para inserir do ConfiguracaoController, esse abaixo:

daoFactory.getConfiguracaoDAO().inserir(configuracao);

chama esse método incluir que está nessa classe GenericDAO:

package br.com.senac.pi4.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.vraptor.ioc.Component;

@Component
public class GenericDAO<T>{

    private final Class classe;
    private Session sessao;

    public GenericDAO(Class classe, Session sessao){
        this.classe = classe;
        this.sessao = sessao;
    }
    
	public void inserir(T t) {
		Transaction transacao = sessao.beginTransaction();
		sessao.saveOrUpdate(t);
		transacao.commit();
	}
	
	public <T> T procurarPorId(int id) {
        T t = (T) this.sessao.load(this.classe, id);
        return t;
    }
	
	public List<T> listarTodos(){
		List<T> lista = this.sessao.createCriteria(this.classe).list();
		return lista;
	}
	
}

Já tentei trocar para sessao.save(t); no lugar de sessao.saveOrUpdate(t); mas deu o mesmo problema.

bruno_r_santana

Engraçado que fazendo uma classe teste passando a lista de kits no construtor da classe Configuracao funciona:

Hibernate: insert into veiculo (FK_marca, modelo, preco) values (?, ?, ?)

Hibernate: select this_.PK_id_kit as PK1_6_0_, this_.descricao as descricao6_0_, this_.kit as kit6_0_, this_.preco as preco6_0_ from kit this_

Hibernate: insert into configuracao (FK_cliente, FK_veiculo) values (?, ?)

Hibernate: insert into configuracao_kit (FK_configuracao, FK_kit) values (?, ?)
package br.com.senac.pi4.teste;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import br.com.senac.pi4.dao.DAOFactory;
import br.com.senac.pi4.dao.GenericDAO;
import br.com.senac.pi4.dao.HibernateUtil;
import br.com.senac.pi4.dao.VeiculoDAO;
import br.com.senac.pi4.model.Acessorio;
import br.com.senac.pi4.model.Cliente;
import br.com.senac.pi4.model.Configuracao;
import br.com.senac.pi4.model.Kit;
import br.com.senac.pi4.model.Marca;
import br.com.senac.pi4.model.Veiculo;
import br.com.senac.pi4.model.Versao;

public class TesteConfiguracao {
	public static void main(String[] args) {
		teste();
	}

	public static void teste() {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		Transaction t = sessao.beginTransaction();
		
		GenericDAO<Veiculo> d1 = new GenericDAO<Veiculo>(Veiculo.class, sessao);
		Veiculo veiculo = new Veiculo();
		d1.inserir(veiculo);
		
		GenericDAO<Kit> d2 = new GenericDAO<Kit>(Kit.class, sessao);
		List<Kit> listaKits = d2.listarTodos();

		Configuracao config1 = new Configuracao(veiculo, listaKits,
				null, null);

		t = sessao.beginTransaction();
		sessao.saveOrUpdate(config1);
		t.commit();

		sessao.close();
	}
}

Como faço para funcionar a integração da minha jsp e do meu controller? Não sei pq ocorre um update e um delete…

Obrigado.

Lucas_Cavalcanti

vc precisa salvar cada um dos Kit’s individualmente, setando a configuração em cada um deles…

Lucas_Cavalcanti

se vc tah num OneToMany forte (sem o mapped by) o hibernate vai ficar fazendo esses deletes e updates mesmo, pq ele gerencia isso por uma tabela diferente… então cada vez que vc salva a configuração ele tem que reproduzir a lista nessa outra tabela…

bruno_r_santana

Obrigado pela resposta Lucas, mas não entendi a solução que você sugeriu. Poderia explicar melhor por favor?

Pelos meus testes funciona se eu passar uma lista de Kits para um objeto Configuracao e não passar uma Configuracao para cada Kit. Mas se me explicar melhor posso tentar.

Obrigado.

bruno_r_santana

Mapeei ManyToMany e não OneToMany. Mapeamento no Configuracao.java:

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "configuracao_kit", joinColumns = { 
			@JoinColumn(name = "FK_configuracao", nullable = false, updatable = false) }, 
			inverseJoinColumns = { @JoinColumn(name = "FK_kit", 
					nullable = false, updatable = false) })
	public List<Kit> getKits() {
		return kits;
	}

	public void setKits(List<Kit> kits) {
		this.kits = kits;
	}

Na classe Kit.java:

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "kits")
	public List<Configuracao> getConfiguracoes() {
		return configuracoes;
	}
	public void setConfiguracoes(List<Configuracao> configuracoes) {
		this.configuracoes = configuracoes;
	}
Lucas_Cavalcanti

mas serve a mesma coisa… se vc tah no many to many lado forte (sem mapped by) ele vai aplicar todas as alterações que vc fizer na lista automaticamente no banco… isso via deletes e inserts na tabela de relacionamento…

o ideal eh que cada kit seja carregado do banco antes de ser colocado na lista, assim evita que ele tente alterá-lo.

e se por acaso vc tiver outra lista many to many e não passar nada nela, ela será limpa qdo vc atualizar a configuração.

bruno_r_santana

Desculpe Lucas mas estou começando mexer com Hibernate e não entendi como devo proceder para arrumar meu código. No controller eu faço uma consulta e carrego a lista de kits passando ela para a view. Dessa forma cada kit é carregado do banco e incluso na lista, não? Tenho que carregar um kit por vez e adiconar na lista? Tipo dar um select para cada kit, tipo um select com clausula where id_kit = … ?

Como uso esse mapped by no hibernate para mapear o manyToMany?

Como que é a questão de passar lista vazia e limpar? Se eu passar uma lista de kits vazia o que será limpo?

Vixi, estou muito confuso e o pior é que a entrega do projeto é daqui 4 dias… peço uma ajuda por favor. Desculpe o incômodo mas se puder dar mais detalhes e exemplificar fica melhor para entender.

Obrigado.

Lucas_Cavalcanti

vc carrega a lista pra ir pra view, mas qdo vc coloca no checkbox, só vai o id, e não o objeto inteiro. Por isso vc tem que recarregar na próxima requisição.

Vc não precisa fazer o select… faz só um load no hibernate.

o mapped by serve pro lado fraco, no seu caso não serve.

se vc passar uma lista vazia de kits e salvar a configuração, todas as linhas da tabela de relacionamento referentes a essa configuração serão deletadas… Ou seja, se vc carregar essa configuração do banco ela não terá kits.

bruno_r_santana

não sei como funciona esse negócio de lado fraco e lado forte, então não entendi o que você disse que o mapped by não serve no meu caso. Se não serve do jeito que eu fiz como eu tenho que fazer então?

Quando eu carrego os checkbox eu uso kit.id_kit e kit.kit que seria o atributo que guarda o nome do kit:

<c:forEach var="kit" items="${kits}" varStatus="status"> <tr> <td><input type="checkbox" name="configuracao.kits[${status.index}].id_kit" value="${kit.id_kit}" /> ${kit.kit}</td> </tr> </c:forEach>

Então eu tenho o objeto todo aqui na view pq chama qualquer atributo dele, não? Como assim só tenho o id?

Não sei como usar esse load do Hibernate, vou pesquisar aqui, mas se tiver algum exemplo ai ajuda.

valeu!

Lucas_Cavalcanti

na view vc tem o objeto inteiro, mas quando vc submete o formulário não tem como ter o objeto, são só parâmetros de formulário.

qdo vc recebe isso no servidor é o VRaptor quem instancia os objetos a partir desses dados de formulário e como você só passou o id do kit, no controller vc só vai ter um objeto do tipo kit com só o id preenchido. Isso não é um problema geralmente.

Na maioria dos casos funciona colocar esse objeto só com o id preenchido na lista (sem o mapped by), que o hibernate vai saber persistir isso. Caso ele não consiga, vc tem que fazer o load de cada kit (via session.load(Kit.class, id)) e jogar na lista.

é importante conhecer como funciona o hibernate para não ter esse tipo de surpresas. Sugiro que faça algum curso de hibernate (como o http://www.caelum.com.br/curso/fj-25).

bruno_r_santana

Lucas, seu uma clareada agora, vou tentar aqui e depois se der certo eu posto a solução. Curso posso fazer mais para frente mas agora tenho que acabar o projeto e entregar dentro de poucos dias na facul…kkkkkkkk, me virar nos trinta aqui.

Obrigado ai man. abraço.

bruno_r_santana

Olá,

Como sou novato com Hibernate e não manjo mapear ManyToMany sem o mappedBy então optei pela outra solução de usar o load.

No controller recebi a lista de Kits que veio somente com os ids dos Kits como o Lucas falou, varri essa lista dando um select no banco para cada id e pegando o objeto Kit real inteiro a jogando em uma nova lista de Kits. No final tenho uma lista de Kits completa não só com os ids mas com os Kits completos. Atribui essa lista de Kits a minha Configuracao e mandei salvar e bingo, deu certo.

Depois comentei a linha onde dava um select para cada id e usei o load do Hibernate mesmo e deu certo da mesma forma:
//Kit kit = daoFactory.getKitDAO().procurarPorId(k.getId_kit());
Kit kit = (Kit) sessao.load(Kit.class, k.getId_kit());

Duas soluções para o problema:

@Post
	@Path("/configuracao/incluir")
	public void incluir(Configuracao configuracao)
	{
		
		if (configuracao != null)
		{
			List<Kit> kitsVieramDaView = configuracao.getKits();
			List<Kit> kits = new ArrayList<Kit>();
			for(Kit k : kitsVieramDaView){
				//Kit kit = daoFactory.getKitDAO().procurarPorId(k.getId_kit());
				Kit kit = (Kit) sessao.load(Kit.class, k.getId_kit());
				System.out.println("Kit com código " + k.getId_kit() + " carregado com sucesso!");
				kits.add(kit);
			}
			configuracao.setKits(kits);
			
			daoFactory.getConfiguracaoDAO().inserir(configuracao);
			System.out.println("Incluindo configuracao...");
		}
		System.out.println("Redirecionando...");
		result.redirectTo(this.getClass()).montagem();
	}

Log:
Hibernate: insert into configuracao (FK_cliente, FK_veiculo) values (?, ?)
Hibernate: insert into configuracao_kit (FK_configuracao, FK_kit) values (?, ?)

Só para constar, do jeito que deu certo ficou assim na view:

<c:forEach var="kit" items="${kits}" varStatus="status">
				<tr>    
           			<td><input type="checkbox" name="configuracao.kits.id_kit" value="${kit.id_kit}" />${kit.kit}</td>
         		</tr> 
			</c:forEach>

Obrigado por toda ajuda Lucas. Depois se puder me instruir com um exemplo sem o mappedBy eu agradeço mais ainda.

Lucas_Cavalcanti

a explicação pra isso é meio grande… procura tutoriais sobre o hibernate, ou tente algum curso como o que eu te mandei.

mas em resumo: Se não tem o mappedBy, é o lado FORTE e tudo que vc modificar no atributo vai pro banco. Se tem o mappedBy é o lado FRACO, e só serve pra consultas, as alterações no atributo não vao pro banco.

Criado 18 de novembro de 2012
Ultima resposta 19 de nov. de 2012
Respostas 19
Participantes 2