na classe Cliente tem um List com os servicos, está me retornando certo, porem na hora que eu tento gravar algum objeto cliente, ele não grava a propriedade quantidade de ServicoCliente somente as declaradas em Servico
public class Cliente{
private int id;
private String nome;
private List servicos;
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
public void setServicos(List servicos){
this.servicos = servicos;
}
public List getServicos(){
return servicos;
}
}
public class Servico(){
private int id;
private String nome;
private double valor;
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
public void setValor(double valor){
this.valor = valor;
}
public double getValor(){
return valor;
}
}
public class ServicoCliente extends Servico{
private int quantidade;
public void setQuantidade(int quantidade){
this.quantidade = quantidade;
}
public int getQuantidade(){
return quantidade;
}
}
import net.sf.hibernate.*
import net.sf.hibernate.cfg.*;
public class AcessoHibernate{
private Configuration cfg = new Configuration();
private SessionFactory factory;
public AcessoHibernate(){
configura();
}
public configura(){
Properties prop = new Properties();
prop.load(getClass().getResourceAsStream("hibernate_config.properties"));
cfg.setProperties(prop);
cfg.configure(getClass().getResource("hibernate.cfg.xml"));
factory = cfg.buildSessionFactory();
}
public void insert(Cliente cliente){
Session session = factory.openSession();
Transaction trans = session.beginTransaction();
session.save(cliente);
trans.commit();
session.close();
}
}
public class Aplicacao(){
public static void main(String[] args){
AcessoHibernate hib = new AcessoHibernate();
Cliente cli = new Cliente();
cli.setNome("Nome do cliente");
ArrayList servicos = new ArrayList();
ServicoCliente serv = new ServicoCliente();
serv.setNome("nome do servico");
serv.setValor(50.0);
serv.setQuantidade(10);
servicos.add(serv);
cli.setServicos(servicos);
}
}
fiz esse codigo aí pra teste, ele insere o cliente, mas na tabela servicos_clientes, ele não grava a quantidade…
1 - pelo q entendi trata-se de um relacionamento n para n… soh não entendi pq vc usa o joined-subclass ao invés de dois relacionamentos 1 para n com a tag <one-to-many> nas entidades SERVIÇOS e CLIENTE.
2 - Vc tb poderia estar analisando os SQLs gerados pelo Hibernate para saber q raio de valor ele está colocando nesse campo de quantidade.
De qq maneira, poste a solução q vc adotou para seu problema.
Estou usando joined-subclass porque se você observar na tabela intermediaria que faz o relacionamento tem um campo a mais “quantidade”, e na coleção que será criada dentro de “Cliente” eu preciso ter objetos com esse dado, então o objeto seria uma junção dos dados da tabela “servicos” e do campo “quantidade” da tabela “servicos_cliente”
public Class ServicoCliente extends Servico{
//o que foi herdado de Servico vem da tabela servicos
private int quantidade; //<-- esse atributo vem da tabela servicos_cliente
}
Uma outro exemplo que talvez seja mais familiar a todos, é de notas fiscais, imaginem uma tabela “produtos”, uma tabela “notas_fiscais” e uma que faz o relacionamento das duas, “itens_notafiscal”, na tabela “itens_notafiscal” eu teria os dois campos que fazem o relaciomento com as outras duas tabelas e um campo “quantidade” que seria a quantidade daquele produto na nota fiscal, como eu faria para mapear isso?
notas_fiscais–
numero_nota
cliente
valor
produtos–
codigo
descricao
preco
itens_notafiscal–
cod_nota
cod_produto
quantidade
eu poderia simplesmente colocar um many-to-many e pronto, mas e o campo quantidade?
tambem não sei se joined-subclass é a forma correta de fazer isso, mas foi o mais proximo que consegui chegar, se alguem tiver alguma ideia…