Como mapear esse relacionamento

32 respostas
A

pessoal como mapear esse problema.

tabela CFO
codCfo pk
codColigada pk fk

tabela PRD
codPrd pk
codColigada pk fk

tabela GrupoDesconto
codDesconto pk
codColigada fk
codCfo fk
codPrd fk

como mapear essa classe GrupoDesconto estou tentando assim mas não esta funcionando

@Entity
@Table(name = "tbGrupoDesconto")
public class GrupoDesconto implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer codDesconto;
    
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO"),
        @JoinColumn(name="CODCOLIGADA")
    })
    private FCfo codCfo;//tem @EmbeddedId

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD"),
        @JoinColumn(name="CODCOLIGADA")
    })
    private TPrd idPrd;//tem @EmbeddedId

    private Integer desconto;

  //getssets...

as classes Prd e Cfo possuem chave composta @EmbeddedId

erro : Repeated column in mapping for entity pacote (should be mapped with insert=“false” update=“false”)

32 Respostas

I

Como existem dois atributos mapeados com o mesmo nome o hibernate reclama, basta vc fazer exatamente o que ele pediu e mesmo que vc passe um valor diferente nesse atributo ele vai desconsiderar.

Sempre que quiser alterar ela vai ter que alterar a outra FK.

Vc está criando essa tabela do zero? Ou ela já existia? O ideal era não possuir dos atributos referenciando a mesma coluna.

@Entity 
@Table(name = "tbGrupoDesconto")   
public class GrupoDesconto implements Serializable{   
  
    @Id   
    @GeneratedValue(strategy = GenerationType.IDENTITY)   
    private Integer codDesconto;   
       
    @ManyToOne   
    @JoinColumns({   
        @JoinColumn(name="CODCFO"),   
        @JoinColumn(name="CODCOLIGADA")   
    })   
    private FCfo codCfo;//tem @EmbeddedId   
  
    @ManyToOne   
    @JoinColumns({   
        @JoinColumn(name="IDPRD"),   
        @JoinColumn(name="CODCOLIGADA", insert = false, update = false)   
    })   
    private TPrd idPrd;//tem @EmbeddedId   
  
    private Integer desconto;   
  
  //getssets...
A

ola essa tabela é de um sistema ja em produção e estou mapeando para fazer integração com este sistema

L

o que posso te falar de cara é que os nomes estão pessimos!

não coloque abreviação, qualquer pessoa que for ler seu objeto, deve identificar, apenas lendo o nome do método/propriedade, do que se trata …

a pessoa ler algo como “private FCfo codCfo;” e certamente ter q fazer um grande esforço para identificar o que é …

isso é um objeto e não precisa seguir as abreviações criadas pelo maluco do dba que inventou a tabela…

fica ate ruim de ler, pra ajudar no seu problema =/

A

obrigado pela dica Lavieri. mas para nossa equipe de desenvolvimento adotou um padrão para facilitar para nós mesmo. A classe tem que ter o mesmo nome da tabela do sistema legado. as chaves devem ser cod + nome da classe e assim por diante.

A

se eu deixo assim da esse erro
Repeated column in mapping for entity: pojo.GTPrdFCfoDesconto column: CODCOLIGADA (should be mapped with insert=“false” update=“false”)

@Embeddable
@DataTransferObject
public class ChaveCompostaGTPrdFCfoDesconto implements Serializable {
        
    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private FCfo codCfo;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private TPrd idPrd;

se ficar assim da esse erro
Mixing insertable and non insertable columns in a property is not allowed: pojo.ChaveCompostaGTPrdFCfoDescontoidPrd

@Embeddable
@DataTransferObject
public class ChaveCompostaGTPrdFCfoDesconto implements Serializable {
        
    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO"),
        @JoinColumn(name="CODCOLIGADA")
    })
    private FCfo codCfo;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD"),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private TPrd idPrd;

na tabela ta assim

CODCOLIGADA pk,fk
CODCFO pk,fk
IDPRD pk,fk
DESCONTO

o meu problema é identico a esse http://markmail.org/message/cv7ra3iyimaeqe56

L

é um pena a decisão de vcs, pq vcs limitam o conhecimento sobre o problema a quem conhece o “código” de abreviação de vcs… enfim, mas o projeto é de vcs ^^

gora com calma… explica direito o que vc quer mapear…

tabela CFO
codCfo pk
codColigada pk fk

tabela PRD
codPrd pk
codColigada pk fk

tabela GrupoDesconto
codDesconto pk
codColigada fk
codCfo fk
codPrd fk

ve que ta faltando algo ?? kd a tabela codColigada ?? … o que é codCfo ?? numero? string ? caracter ??
pq uma chave composta onde uma coisa aparentemente é o proprio código da tabela a outra coisa é uma FK ?? qual o sentido ?? se ja tem um codCfo, pra que incluir o codColigada a Primary Key ??

posta ai direito como é o relacionamento q fica + facil

A

blz vou com calma…

tabela

GCOLIGADA
codColigada smallint not null pk

TPRD
IDPRD int not null pk
CODCOLIGADA smallint not null pk fk

FCFO
CODCFO varchar(25) not null pk
CODCOLIGADA smallint not null pk fk

tabela com problema no relacionamento

_GTPRDFCFODESCONTO
codColigada smallint not null pk fk
CODCFO varchar(25) not null pk fk
IDPRD int not null pk fk
desconto real not null

@Entity
@Table(name = "_GTPRDFCFODESCONTO")
public class GTPrdFCfoDesconto implements Serializable{

    @EmbeddedId
    private ChaveCompostaGTPrdFCfoDesconto codGTPrdFCfoDesconto;

    @Column(columnDefinition="REAL",name="DESCONTO",nullable=false)
    private Float desconto;

getsetrs...

}
@Embeddable
public class ChaveCompostaGTPrdFCfoDesconto implements Serializable{

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name="IDPRD",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private TPrd idPrd;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name="CODCFO",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private FCfo codCfo;

getseters.. + contrutores
}

esses update false e insert false ja tentei trocar variar as posições entre eles, colocar em um tirar no outro. O erro varia entre:
Mixing insertable and non insertable columns in a property is not allowed e Repeated column in mapping for entity: pojo.GTPrdFCfoDesconto column: CODCOLIGADA (should be mapped with insert=“false” update=“false”)

se eu colocar referencedColumnName=“CODCOLIGADA” dentro dos joinColumn dos CODCOLIGADA da esse erro:Unable to find column with logical name in table TPRD

L

arthurminarini:
blz vou com calma…

tabela

GCOLIGADA
codColigada smallint not null pk

TPRD
IDPRD int not null pk
CODCOLIGADA smallint not null pk fk

FCFO
CODCFO varchar(25) not null pk
CODCOLIGADA smallint not null pk fk

tabela com problema no relacionamento

_GTPRDFCFODESCONTO
codColigada smallint not null pk fk
CODCFO varchar(25) not null pk fk
IDPRD int not null pk fk
desconto real not null

Consegue perceber o quanto estranho soa essas suas tabelas ?? ou ta faltando algo, ou essas chaves primarias estão erradas, vou repetir denovo o q falei no post la em cima…

se IDPRD é chave primaria de TPRD e não uma chave estrangeira, então não faz sentido vc fazer chave composta, visto que esse ID já é a chave primaria da tabela, a não ser q isso não seja um código PK e sim outra FK, se for outroa FK por favor mostrar a tabela que ele relaciona, se não for, não há sentido de existir essa chave composta, já que apenas IDPRD ja identifica um registro…

ai vem a pergunta, qual é a logica desse IDPRD ?? ele é montado automaticamente ? como ele é feito ?? exite casos onde um produto de IDPRD igual ter varios registros com COLIADA diferente ??

essas são as duvidas… e pelo que estou vendo, no seu relacionamento, seu erro esta nessas classes, e por isso que esta dando problema no seu mapeamento…

problema de insertable e updatable falso, são dados quando vc tem referencias duplicadas a um mesmo campo da tabela, vc esta mostrnado 5% das suas classes, e assim fica complicado de debugar seu problema, ainda mais sendo suas classes pouco claras quanto ao que elas relamente modelam, devido a esses nomes estranhos de tabelas o.O

A

heheh. vlw pela ajuda. Cara, estou fazendo integração com um sistema de uma empresa grande, não sei se posso falar aqui, mas essas são as tabelas dele. Até eu tbm não concordo com essas chaves compostas das tabelas não vejo motivo tbm (parece tabelas de sistemas em clipper pois um dia foi e evoluiram). TPRD é tabela de produtos e tem o idprd e de qual coligada é o produto. no meu ver e tbm ao seu esse relacionamento poderia ser feito com apenas fk correto. mas pergunto: se na tabela for chave composta eu posso mapear na classe o idprd normalmente como @Id e depois fazer um outro campo de manytoone sera que o hibernate deixa vc recomenda, o que vc acha (tenta entender meu lado. eu apenas estou tentando jogar para o hibernate) :cry:

L

bom, so faltou falar a strageia usada para popular o campo ID de produto, mas acreditando que TPRD é uncio, e o valor do campo é gerado pelo banco de dados, a forma correta de mapear seria

@Entity
@Table(name="GCOLIGADA")
public class Coligada {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY
   @Column(name="codColigada") //se o nome do id no banco é feio, é um problema do banco
   private Integer id;

   public Integer getId() {
       return id;
   }
   //se o ID é dado pelo banco, então não há motivos de haver set para o ID...

   public @Override boolean equals(Object o) {
       return o instanceOf Coligada && equals(Coligada(o));
   }
   
   private boolean equals(Coligada o) {
       if (getId() == null)
          return false;
       return getId().equals(other.getId()); 
       //Ps.: so fiz o equals pelo ID pq é unica propridade q vc citou, normalmente o equals deve ser feito por um campo unico
       //que identifica o objeto, de preferencia um campo que não seja o ID.
   }

   public @Override int hashCode() {
      int hash = 5;
      hash = hash + 7*getId();
      return hash;
   }
}
@Entity
@Table(name="TPRD")
public class Produtos { //o nome da tabela e essas firulas vc deixa pra quem inventou o banco maluco
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY) //aqui estou informando que a strategia é definda pelo banco
   @Column(name="IDPRD") //se o nome do id no banco é feio, é um problema do banco
   private Integer id; //isto identifica um produto

   @ManyToOne
   @JoinColumn(name="CODCOLIGADA")
   private Coligada coligada;
   
   public Integer getId() {
       return id;
   }
   //é importante que ID não tenha set, afinal se a strategia é definda pelo banco, então o ID nunca sera defindo pelo usuário.

   public Coligada getColigada() {
      return coligada;
   }
   public void setColigada(Coligada coligada) {
      this.coligada = coligada;
   }

   public Integer getColigadaId() {
      return coligada == null ? null : coligada.getId();
   }
   //o id de coligada não pode ser defindo, é preciso ter um objeto coligado, e envialo, para assim difinir o id.

   public @Override boolean equals(Object o) {
       return o instanceOf Produto && equals(Produto(o));
   }
   
   private boolean equals(Produto o) {
       if (getId() == null)
          return false;
       return getId().equals(other.getId()); 
       //Ps.: so fiz o equals pelo ID pq é unica propridade q vc citou, normalmente o equals deve ser feito por um campo unico
       //que identifica o objeto, de preferencia um campo que não seja o ID.
   }

   public @Override int hashCode() {
      int hash = 5;
      hash = hash + 7*getId();
      return hash;
   }
}

agora vem ao porem, como vc ta dnado as informações aos pokinhos fica muitoooo complicado de ajudar, por exemplo, eu não sei como mapear FCFO pq não sei como é definido sua chave primaria... nem se ela realmente deve ser composta, portanto vou omitir essa parte ate vc informar como ela é feita...

@Embedable
public class DescontoPK {
   @ManyToOne
   @JoinColumn(name="codColigada")
   private Coliada coligada;

   @ManyToOne
   @JoinColumn(name="IDPRD")
   private Produto produto;
   
   //essa parte aqui só vou supor, pq não sei como realmente vai ser mapeado
   @ManyToOne
   @JoinColumn(name="CODCFO")
   private Funcionario funcionario; //estou supondo tb que cfo = codigo funcionario
   
   protected DescontoPK() {} //esse construtor é so pro hiberante poder crair a classe em branco, por isso seu nivel é protected

   public DescontoPk(Produto produto, Funcionario funcionario) {
      if (produto == null || funcionario == null || produto.getColigada() == null || funcionario.getColigada() == null)
         throw new IllegalArgumentException(); // pois não é permitido valores nulos aki
      if ( produto.getColigada().equals(funcionario.getColigada()) )
         throw new IllegalArgumentException(); // os valores dos 2 tem q ser iguais...

     this.produto = produto;
     this.funcionario = funcionario;
     this.coligada = produto.getColigada();
   }
   
   public Funcionario getFuncionario() {
      return funcionario;
   }
   
   public Produto getProduto() {
      return produto;
   }
   
   public Coligada getColigada() {
      return coligada;
   }
   
   public @Override boolean equals(Object o) {
      return o instanceof Desconto && equals((DescontoPk)o);
   }
   
   private boolean equals(DescontoPk other) {
      assert(other != null); //eu garanto isso pois esse método é private
      return getProduto().equals(other.getProduto()) && getFuncionario().equals(other.getFuncionario());
   }
   
   public @Override int hashCode() {
      int hash = 11;
      hash = hash + 23* getProduto().hashCode();
      hash = hash + 23* getFuncionario().hashCode();
      hash = hash + 23* getColigada().hashCode();
      return hash;
   }
}
@Entity
@Table(name="_GTPRDFCFODESCONTO")
public class Desconto {
   @EmbeddedId
   private final DescontoPk id; //final pois o ID nunca será alterado.
   
   private Double desconto;

   protected Desconto() {id = null;} //construtor vazio existe apenas para o hibernate poder instanciar
   public Desconto(Produto produto, Funcionario funcionario) {
      id = new DescontoPK(produto,funcionario);
   }
   
   public Desconto(Produto produto, Funcionario funcionario,Double desconto) {
      this(produto,funcionario);
      this.desconto = desconto;
   }
   
   public DescontoPK getId() {
      return id;
   }

   public Produto getProduto() {
      return getId().getProduto();
   }
   
   public Funcionario getFuncionario() {
      return getId().getFuncionario();
   }
   
   public Coligada getColigada() {
      return getId().getColigada();
   }

   public Double getDesconto() {
      return desconto;
   }
   
   public void setDesconto(Double desconto) {
      this.desconto = desconto;
   }
}

se tiver duvidas sobre equals ou hashcode, viste esse link http://java-i9se.blogspot.com/2009/04/igualdade-em-java-equals-e-hashcode.html

caso não tenha entendido o mapeamento, veja que as Entidades são Objetos, e os annotations é que são suas ligações com a base de dados, não faz sentido nomear o Objeto, que é algo que vc vai usar, com nome de tabela, que não representa o dominio que vc esta usando...

Note que se o ID é automatico, então eu reflito isso na minha Entidade, e não permito que exista set no ID, pois é o banco que define o id, e mesmo sem o método "set" o hibernate vai saber popular o campo...

Note tb que com IDs compostos, pode-se usar ligação entre os Objetos que são as FK, não se deve fazer uso dos IDs, o ideal é que no seu modelo vc esqueça que os IDs existam, e os use apenas caso queira achar um registro especifico na tabela...

veja que o Objeto Desconto, tem um ID composto de 3 partes, e essas partes são obrigatorias, assim posos na construção do Objeto Desconto, tornar o campo obrigatorio atravez de seus contrutories...

............

veja um exemplo do uso...

............

Desconto desconto = new Desconto(banana,ricardo,1.23d);

aqui esotu criando um desconto, de 1,23 onde a xave composta é "banana", "ricardo" e o coligada esta implicito, pois tanto banana como ricardo ja tem referencia a eles...

espero q tenha entendido

A

vlw entendi . mas fazendo consulta a TPRD(produto) verifiquei

SELECT IDPRD, COUNT() AS total
FROM dbo.TPRD
GROUP BY IDPRD
HAVING (COUNT(
) > 1)

ele me retornou varios totais com valores 2 então tem nescessidade da chave composta pois os registro são iguais mas de coligadas diferentes

ja FCFO (cliente) fiz a mesma coisa e retornou totais com 2 tbm. então ha nescessidade das chaves compostas. como ficaria então

@Embeddable
@DataTransferObject
public class ChaveCompostaGTPrdFCfoDesconto implements Serializable{

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD"),
        @JoinColumn(name="CODCOLIGADA")
    })    
    private TPrd idPrd;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO"),
        @JoinColumn(name="CODCOLIGADA")
    })    
    private FCfo codCfo;

    public ChaveCompostaGTPrdFCfoDesconto() {
    }

    public ChaveCompostaGTPrdFCfoDesconto(TPrd idPrd, FCfo codCfo) {
        this.idPrd = idPrd;
        this.codCfo = codCfo;
    }

    @RemoteProperty
    public FCfo getCodCfo() {
        return codCfo;
    }

    public void setCodCfo(FCfo codCfo) {
        this.codCfo = codCfo;
    }

    @RemoteProperty
    public TPrd getIdPrd() {
        return idPrd;
    }

    public void setIdPrd(TPrd idPrd) {
        this.idPrd = idPrd;
    }

}

essa classe ta matando heeh

tenho que mapear essa tabela



L

veja bem, como falei pra vc, insertable e updatable são requiridos quando há duplicação de campos...

como CODCOLIGADA esta duplicado na sua PK, vc só pode referenciar o campo CODCOLIGADA com insertable e updatable true uma única vez, poranto seria assim

@Embeddable
public class DescontoPK implements Serializable{

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD"),
        @JoinColumn(name="CODCOLIGADA", insertable = true, updatable = true)
        //obs.: omitir o insertable e updatable é o mesmo que definilos true, portanto vc pode omitir a linha acima
        //porem como logo abaixo esta false, é bom deixar por exeplicito, para mostrar q diferença de um pro outro
    })    
    private final Produto produto; //é final posi isso é um ID, então seus valores nunca mudam

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO"),
        @JoinColumn(name="CODCOLIGADA", insertable = false, updatable = false) //veja que aqui ta false
    }) 
    private final Funcionario funcionario; //é final posi isso é um ID, então seus valores nunca mudam
    
    //como falei, quando vc tem campos duplicados no seu mapeamento, vc precisa definir insertable e updatable como false no campo duplicado
    
    @Deprecated //essa anotação deixa claro que não deve usar esse construtor no seu projeto
    protected DescontoPK() {produto=null;funcionario=null;} //disponivel apenas para o hibernate

    public DescontoPK(Produto produto, Funcionario funcionario) {
        if (!produto.getColigada().equals(funcionario.getColigada())
           throw new IllegalArgumentException("Coligada de produto e funcionario devem ser iguais na composição do Desconto ID");
        this.produto = produto;
        this.funcionario = funcionario;
        
        //Obs.: perceba que logo no primeiro if
        //se produto ou funcionario for null uma NullPointerException (NPE) será lançada
        //e não queremos ele null, portanto relamente deve-se lançar ou uma NPE
        //ou uma IllegalArgumentException (IAE), se quiser uma IAE, terá que colocar um
        //if antes, e testar se são nulas, e sendo lançar a exceção de nulidade...
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public Produto getProduto() {
        return produto;
    }

    public Coligada getColigada() {
        return getProduto().getColigada(); 
        //é importante user getProduto() e não diretamente a propriedade "produto"
        //o hibernate vai sobrescrever essa classe e o valor de produto vai ser null
        //e seu valor real so sera retornado através de getProduto()
        //e isso se chama encapsulamento...
        //sempre que tiver uma classe que pode ser extendida, chame suas propriedades
        //pelo metodo "get" e nunca diretamente, pois alguem que a extenda, pode mudar
        //a forma como o "get" funciona.
    }

   // ===>> IMPORTANTE <<===
   // Defina EQUALS e HASHCODE, é importante faze-lo, vc esta mapeando entidades, e é preciso compara-las futuramente
   // ja mostrei em outras partes exemplo de como faze-lo
   // se tiver duvidas olhe no meu blog
}

assim a sua classe Desconto ficaria assim

@Entity  
@Table(name="_GTPRDFCFODESCONTO")
public class Desconto implements Serializable{
   @EmbeddedId
   private final DescontoPK id; //é final pq é um ID defindo para construir a classe
   private Double desconto;
   
   @Deprecated //essa anotação deixa claro que não deve usar esse construtor no seu projeto
   protected Desconto(){id = null;} //usado apenas pelo hibernate
   
   public Desconto(Produto produto, Funcionario funcionario){
      id = new DescontoPK(produto,funcionario);
   }
   
   public Desconto(Produto produto, Funcionario funcionario, Double desconto){
      this(produto,funcionario);
      setDesconto(desconto);
   }   

   public Double getDesconto() {
      return desconto;
   }
   
   public void setDesconto(Double desconto) {
      this.desconto = desconto;
   }
   
   public Produto getProduto() {
      return getId().getProduto();
      //lembre-se o q comentei na outra classe, sempre pega uma propriedade através do "get"
   }
   
   public Funcionario getFuncionario() {
      return getId().getFuncionario();
   }
   
   public Coligada getColigada() {
      return getId().getColigada();
   }

   // ===>> IMPORTANTE <<===
   // Defina EQUALS e HASHCODE, é importante faze-lo, vc esta mapeando entidades, e é preciso compara-las futuramente
   // ja mostrei em outras partes exemplo de como faze-lo
   // se tiver duvidas olhe no meu blog
}

Lembre-se... nunca ponha sets, em propriedades que vc não vai alterar, sempre defina como "final" valores que vc nunca pretende alterar, isso previne de alterações por engano em algum ponto do programa, caso mude de ideia um dia, vc vai la e tira o final e poem um set...

vc esta trabalhando com Hibernate e ele vai herdar todas as suas classes vai sobrescrever todos os seus métodos, todas as suas propriedades vão ser definidas como nulas, se quiser manter a integridade, nunca, NUNCA, resgate o valor de um propriedade sem ser através dos "get"s e nunca, NUNCA, altere seu valor sem ser em um método "set"s

Se por exemplo, vc olhar uma classe que o hiberante retorna através de uma session, verá que ela nunca é uma classe do mesmo tipo que vc definiu, e que é sempre um subtipo, por exemplo

Produto produto = session.load(Produto.class, produtoId); //recuperando um produto do banco
boolean isProdutoClass = produto.getClass().equals(Produto.class); //isso é false
boolean isProdutoSubTipo = produto instanceof Produto; //isso é true

System.out.println("O produto retornado pela session é da mesma classe de produto? " + isProdutoClass);
System.out.println("O produto retornado pela session é de uma sub-classe de produto? " + isProdutoSubTipo);

isso imprime:
"O produto retornado pela session é da mesma classe de produto? false"
"O produto retornado pela session é de uma sub-classe de produto? true"

Espero ter ajudado

A

vlw mesmo pela “Aula” heheh. Mas aqui… essa linha que vc colocou dispara esse exception

@ManyToOne  
     @JoinColumns({  
         @JoinColumn(name="CODCFO"),  
         @JoinColumn(name="CODCOLIGADA", insertable = false, updatable = false) //veja que aqui ta false  
     })   
     private final Funcionario funcionario;

Mixing insertable and non insertable columns in a property is not allowed:

L

então modifique a classe PK assim

atenção especial para a linha comentada com [color=green]//<<<=== MUDANÇA <====[/color]

@Embeddable   
public class DescontoPK implements Serializable{   
  
    @ManyToOne   
    @JoinColumns({   
        @JoinColumn(name=&quot;IDPRD&quot;),   
        @JoinColumn(name=&quot;CODCOLIGADA&quot;, insertable = true, updatable = true)   
    })       
    private final Produto produto; 
  
    @ManyToOne   
    @JoinColumns({   
        @JoinColumn(name=&quot;CODCFO&quot;, insertable = false, updatable = false),  //&lt;&lt;&lt;=== MUDANÇA &lt;====
        @JoinColumn(name=&quot;CODCOLIGADA&quot;, insertable = false, updatable = false)
    })   
    private final Funcionario funcionario; 
    
    private String CODCFO; //&lt;&lt;&lt;=== MUDANÇA &lt;====
    
    @PreUpdate
    @PrePersist
    private void updateCodCfo() {CODCFO = funcionario.getCodcfo()} //&lt;&lt;&lt;=== MUDANÇA &lt;====
       
    @Deprecated 
    protected DescontoPK() {produto=null;funcionario=null;}
  
    public DescontoPK(Produto produto, Funcionario funcionario) {   
        if (!produto.getColigada().equals(funcionario.getColigada())   
           throw new IllegalArgumentException(&quot;Coligada de produto e funcionario devem ser iguais na composição do Desconto ID&quot;);   
        this.produto = produto;   
        this.funcionario = funcionario;
        CODCFO = funcionario.getCodcfo(); //&lt;&lt;&lt;=== MUDANÇA &lt;====           
    }   
  
    public Funcionario getFuncionario() {   
        return funcionario;   
    }   
  
    public Produto getProduto() {   
        return produto;   
    }   
  
    public Coligada getColigada() {   
        return getProduto().getColigada();   
    }   
  
   // ===&gt;&gt; IMPORTANTE &lt;&lt;===   
   // Defina EQUALS e HASHCODE, é importante faze-lo, vc esta mapeando entidades, e é preciso compara-las futuramente   
   // ja mostrei em outras partes exemplo de como faze-lo   
   // se tiver duvidas olhe no meu blog   
}
A

blz vlw. concerteza esse topico vai ser util pra mais um monte de gente. Mas uma pergunta. Eu uso o net beans 6.5 e quanto termino de criar os atributos pesso a ele para gerar automaticamente os geteres e seteres e manda tbm ele gerar o equas e hash code, ele pede para escolher qual compo fazer o equas e hash code eu sempre marco o compo que é a chave primaria. Estou correto? posso usar deste jeito que eu falei? ele gera certo? posso confiar no que ele gerou?

veja por exemplo como ele criou nesta classe

@Entity
@Table(name = "_GTPRDFCFOINDICE")
@DataTransferObject//Eu uso DWR (faz o ajax javascript)
public class GTPrdFCfoIndice implements Serializable{

    @Id
    @RemoteProperty//para DWR
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "CODTPRDFCFOINDICE", columnDefinition = "INTEGER",nullable=false)
    private Integer codTPrdFCfoIndice;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO"),
        @JoinColumn(name="CODCOLIGADA")
    })
    private FCfo codCfo;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD",insertable=false,updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false,updatable=false)
    })
    private TPrd idPrd;

    @RemoteProperty
    @Column(name = "INDICE", columnDefinition = "NUMERIC", precision = 3, scale = 3, nullable=false)
    private Float indice;

    @RemoteProperty
    public FCfo getCodCfo() {
        return codCfo;
    }

    public void setCodCfo(FCfo codCfo) {
        this.codCfo = codCfo;
    }

    @RemoteProperty
    public Integer getCodTPrdFCfoIndice() {
        return codTPrdFCfoIndice;
    }

    public void setCodTPrdFCfoIndice(Integer codTPrdFCfoIndice) {
        this.codTPrdFCfoIndice = codTPrdFCfoIndice;
    }

    @RemoteProperty
    public TPrd getIdPrd() {
        return idPrd;
    }

    public void setIdPrd(TPrd idPrd) {
        this.idPrd = idPrd;
    }

    @RemoteProperty
    public Float getIndice() {
        return indice;
    }

    public void setIndice(Float indice) {
        this.indice = indice;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final GTPrdFCfoIndice other = (GTPrdFCfoIndice) obj;
        if (this.codTPrdFCfoIndice != other.codTPrdFCfoIndice && (this.codTPrdFCfoIndice == null || !this.codTPrdFCfoIndice.equals(other.codTPrdFCfoIndice))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 83 * hash + (this.codTPrdFCfoIndice != null ? this.codTPrdFCfoIndice.hashCode() : 0);
        return hash;
    }
}
R

arthurminarini:
se eu deixo assim da esse erro
Repeated column in mapping for entity: pojo.GTPrdFCfoDesconto column: CODCOLIGADA (should be mapped with insert=“false” update=“false”)

@Embeddable
@DataTransferObject
public class ChaveCompostaGTPrdFCfoDesconto implements Serializable {
        
    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private FCfo codCfo;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private TPrd idPrd;

se ficar assim da esse erro
Mixing insertable and non insertable columns in a property is not allowed: pojo.ChaveCompostaGTPrdFCfoDescontoidPrd

@Embeddable
@DataTransferObject
public class ChaveCompostaGTPrdFCfoDesconto implements Serializable {
        
    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO"),
        @JoinColumn(name="CODCOLIGADA")
    })
    private FCfo codCfo;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD"),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private TPrd idPrd;

na tabela ta assim

CODCOLIGADA pk,fk
CODCFO pk,fk
IDPRD pk,fk
DESCONTO

o meu problema é identico a esse http://markmail.org/message/cv7ra3iyimaeqe56

O hibernate não aceita fazer joinColumns sendo que apenas um é insertable e updatable. Voce deve estar usando o hibernate correto?

Nessa classe, faz assim que eu acho qeu dá certo:

@Embeddable
@DataTransferObject
public class ChaveCompostaGTPrdFCfoDesconto implements Serializable {
    @Column(name="CODCFO")
    private Integer codCFO = null;
    @Column(name="CODCOLIGADA")
    private Integer codCoLigada = null;
    @Column(name="IDPRD")
    private Integer idPrd = null;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="CODCFO",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private FCfo codCfo;

    @RemoteProperty
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="IDPRD",insertable=false, updatable=false),
        @JoinColumn(name="CODCOLIGADA",insertable=false, updatable=false)
    })
    private TPrd idPrd;

E tente adaptar isso no seu código

L
arthurminarini:
...Eu uso o net beans 6.5 e quanto termino de criar os atributos pesso a ele para gerar automaticamente os geteres e seteres

Dont do that... analise com calma cada coisa, nem tudo é passivel de set's, vc pode mandar gerar todos os getters, mas os sets vc deve tomar muito cuidado... por exemplo, campo auto_incremento de banco de dados não podem ter métodos sets, eles são alterados apenas pelo hibernate no momento da persistencia...

Listas/Coleções não devem ter "set"s não há sentido em utilizar um set em uma list, e ate mesmo o "get" pode, as vezes ser evitado, escondendo a lista modificavel real, e liberando apenas um copia da lista... por exemplo

Acoplamento alto (não recomendado), perdendo o controle de seus dados

public class ProdutoGrupo {
   //..outros atributos
   private List<Produto> produtos;
   public List<Produto> getProdutos() { 
      return produtos; //<==deve se ter cautela com isso
   }

   public void setProdutos(List<Produto> produtos) {this.produto = produto;} //<== não há razões para isso  
}
usando a classe acima com acoplamento alto
GrupoProduto grupoA = getGrupoA(); //abstrai como o grupo A é retornado;
Produto produtos = new List<Produto>();
produtos.add(new Produto());
produtos.add(null);

grupoA.setProdutos(produtos); //percebe o descontrole deste método ??
//vc apaga todos os itens q estava la, e ainda manda lista q podem conter itens, que vc não controu na hora q foram adcionados...

//... agora outro contexto

grupoA.getProdutos().add(null); //percebe que posso adcionar qualquer coisa ? q não há controle ?

neste exemplo acima, a integridade da coleção de produtos do GrupoA é de responsibilidade de quem usa a classe, o que é uma abordagem totalmente errada, o correto é que a propria classe GrupoProdutos mantenha a integridade dos seus dados 100% do tempo, e não permita invasões e alterações sem as devidas autorização previsa

Acoplamento baixo (recomendado), retomando o controle de seus dados

public class ProdutoGrupo {
   //..outros atributos
   private List<Produto> produtos;

   /**
    * Retorna uma lista <b><u>NÃO</b></u> modificável de produtos deste grupo
    * esta lista é apenas para consulta
    * @return lista não modificavel de produtos.
    */
   public List<Produto> getProdutos() { 
      return Collections.unmodifierList(produtos);
   }
   
   /**
    * método interno, usado para modificar a lista de produtos
    */
   private List<Produto> getModifierProdutos() {
      return produtos;
   }
   
   public boolean add(Produto produto) {
      //agora vc tem controle, pode checar o produto antes de adcionar
      //se o produto não for valido pode lançar exceções
      if (produto == null) throw new NullPointerException();
      if (!testaProdutoDeFormaComplexa(produto)) throw new ComplexaException();
      
      //e so quando o produto é conforme
      return getModifierProdutos().add(produto);
   }

   public boolean remove(Produto produto {
       //se um dia vc kizer, pode avisar a agleum q um produto vai ser removido
       //agora vc pode tomar acçoes quando um produto esta para ser removido
       
       //e so então
       return getModifierProdutos().remove(produto);
   }
   
   public boolean remove(Class<?> clazz, index) {
       if (clazz.equals(Produto.class))
           return getModifierProdutos().remove(index);
       else if( clazz.equals(OutraLista.class))
           return getModifierOutraLista().remove(index);
       else
           throw new IllegalArgumentException("Não existe uma lista de " + clazz.getSimpleNome());
   }

   //vc pode incluir outros método como contains, apena para facilitar, pois um contains pode ser realizar atravez de getProdutos().contains()

//removido   public void setProdutos(List<Produto> produtos) {this.produto = produto;}
}

A integridade da classe volta para dentro de GrupoProduto e agora esta classe pode garantir 100% a integridade de seus dados, e qualquer pessoa pode tentar violar, os seus dados e mandar dados incoerente, porem a classe tem todos os mecanismos para se defender disto

percebe a segurança q te da essa segunda abordagem ?? percebe que vc desacoplou sua classe da Coleção ??
percebe que outras classes agora não precisam ficar pisando em ovos na hora de usar as listas de GrupoProduto, com medo de simplismente estragar o relacionamento enviado dados incosistente ??
percebe que agora vc controla de verdade a consistencias dos dados de sua classe? e deixa ela menos exposta ao que tem fora dela ?

agora ninguem mais vai poder violar sua classe, pelomenos não sem o seu controle, não fora do seu dominio, não longe dos seus olhos! se um dia vc precisar mudar algo, sua classe vai estar bem protegida, e vc consiguirar modificar...

arthurminarini:
e manda tbm ele gerar o equas e hash code, ele pede para escolher qual compo fazer o equas e hash code eu sempre marco o compo que é a chave primaria. Estou correto? posso usar deste jeito que eu falei? ele gera certo? posso confiar no que ele gerou?

vc pode confiar sim, ele gera direito na medida do possivel... POREM!! POREM!!!

muita HORA NESSA CALMA! ... o ID nem sempre é bom... id é algo alterável facilmente... e o ID não identifica um objeto único, o ID identifica um REGIDTRO na tabela único... as vezes esses dois coincidem, mas nem sempre coincide...

o ideal é vc procurar o que é unico na classe... o ID quando é auto_incremento, é algo muito mutavel, pois antes de persistir é nulo, depois de persistir não é mais... c vc usalos, vai fazer as coleções HASH falhar, pois elas usam hashCode, e como ele altera depois de persitir... PUFF muda tudo apos um cascade persist de suas classes....

busque propriedades únicas da classe

por exemplo....
Pessoa ? cpf
Carro ? placa
Empresa ? cnpj
Endereço ? cep
Grupo ? descricao

enfim vc tem q bolar uma forma q fique único... se for usar ID, acoselho não usar hashList, se não depois q persistir, não vai conseguir encontrar nada nas suas coleções, a não ser q de um refresh na lsita

L

ralphsilver:

O hibernate não aceita fazer joinColumns sendo que apenas um é insertable e updatable. Voce deve estar usando o hibernate correto?

Nessa classe, faz assim que eu acho qeu dá certo:

E tente adaptar isso no seu código

essa solução q vc sugerir ele ja tinha tentando, e não da certo… no post 14( o ultima da pagina anterior) deste topico tem a resposta para o problema e as alterações necessarias…

o problema era no segundo mapeamento, do funcionario q ja foi alterado e solucionado…

A

no list ta trazendo parte dos objetos veja como ficou a consulta feita pelo hibernate

from
GTPRDFCFOINDICE this
inner join
FCFO fcfo2_
on this_.CODCFO=fcfo2_.CODCFO
and this_.CODCOLIGADA=fcfo2_.CODCOLIGADA
inner join
TPRD tprd3_
on this_.IDPRD=tprd3_.CODCOLIGADA <<<<<<<<<<<<<<<<<<veja ta trocado, como faço para trocar
and this_.CODCOLIGADA=tprd3_.IDPRD <<<<<<<<<<<<<<<<<<<<<<< tem que ser o inverso
left outer join
GUSUARIO gusuario4_
on tprd3_.CODUSUARIO=gusuario4_.CODUSUARIO
No converter found for ‘org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer’ <<<<<<<<que erro é esse?

A

eu invertir os joincolumn do joincoluns e deu certo

A

to com problema ao inserir pois os campos são not null e no mapeamento para funcionar tive que colocar o codcliente e o codcoligada do cliente como insert false e update false pois o codproduto e o codcoligada do produto estão como insert true e update true como vou a fazer agora? preciso de persistir o objeto :cry:

na atualização funciona só insert que não

Cannot insert the value NULL into column ‘CODCFO’, table ‘Corpore.dbo._GTPRDFCFOINDICE’; column does not allow nulls. INSERT fails.

codCfo tem que ser persistido mas a coligada dele não.

me ajuda ai alguem? lavieri?.. :smiley:

L

vai longe em ?? esse teu mapeamento ?

cola ai, exatamente o codigo q tu usou, pra saber o pq q ta dando null…

enfim, o q tiver mapeamento com insertable null e updatable null, tem q estar mapemando em outro canto, com os valores corretos, e é exatamente por isso q em lugar fica com os insertables e updatable null , pq em outro lugar eles existem tb mapeado, e logo serão persistido por esse segundo lugar

A

veja ai o que eu tenho que mudar. ate agora ta tudo funcionando só falta o salvar

@Entity
@Table(name = "_GTPRDFCFOINDICE")
@DataTransferObject
public class GTPrdFCfoIndice implements Serializable {

    @Id
    @RemoteProperty
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    private Integer codTPrdFCfoIndice;

    @RemoteProperty
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "CODCOLIGADA",updatable = true, insertable = true),
        @JoinColumn(name = "IDPRD", updatable = true, insertable = true)
    })
    private TPrd idPrd;

    @RemoteProperty
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumns({
    @JoinColumn(name = "CODCFO", updatable = false, insertable = false),
    @JoinColumn(name = "CODCOLIGADA", updatable = false, insertable = false)
    })
    private FCfo codCfo;

    @RemoteProperty
    @Column(name = "INDICE", columnDefinition = "NUMERIC", precision = 3, scale = 3, nullable = false)
    private Float indice;

    @RemoteProperty
    public FCfo getCodCfo() {
    return codCfo;
    }

    public void setCodCfo(FCfo codCfo) {
    this.codCfo = codCfo;
    }

    @RemoteProperty
    public Integer getCodTPrdFCfoIndice() {
        return codTPrdFCfoIndice;
    }

    public void setCodTPrdFCfoIndice(Integer codTPrdFCfoIndice) {
        this.codTPrdFCfoIndice = codTPrdFCfoIndice;
    }

    @RemoteProperty
    public TPrd getIdPrd() {
        return idPrd;
    }

    public void setIdPrd(TPrd idPrd) {
        this.idPrd = idPrd;
    }

    @RemoteProperty
    public Float getIndice() {
    return indice;
    }

    public void setIndice(Float indice) {
    this.indice = indice;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final GTPrdFCfoIndice other = (GTPrdFCfoIndice) obj;
        if (this.codTPrdFCfoIndice != other.codTPrdFCfoIndice && (this.codTPrdFCfoIndice == null || !this.codTPrdFCfoIndice.equals(other.codTPrdFCfoIndice))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.codTPrdFCfoIndice != null ? this.codTPrdFCfoIndice.hashCode() : 0);
        return hash;
    }

}

o projeto mudou aqui e saiu a chave composta dessa classe e ficou desta meneira acima
obs: não leva em consideração o setid não ok mandei o netbenas gerar depois eu arrumo heheh

L

Lavieri:
//... @PreUpdate @PrePersist private void updateCodCfo() {CODCFO = funcionario.getCodcfo()} //&lt;&lt;&lt;=== MUDANÇA &lt;==== //... }

vc precisa atualizar o campo CODCFO …

pra isso tem q fazer assim

@Entity
@Table(name = "_GTPRDFCFOINDICE")
@DataTransferObject
public class GTPrdFCfoIndice implements Serializable {

    @Id
    @RemoteProperty
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    private Integer codTPrdFCfoIndice;

    @RemoteProperty
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "CODCOLIGADA",updatable = true, insertable = true),
        @JoinColumn(name = "IDPRD", updatable = true, insertable = true)
    })
    private TPrd idPrd;

    @RemoteProperty
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumns({
    @JoinColumn(name = "CODCFO", updatable = false, insertable = false),
    @JoinColumn(name = "CODCOLIGADA", updatable = false, insertable = false)
    })
    private FCfo codCfo;

    @Column(name="CODCFO");
    private String oCampoQFaltaPersistir; //&lt;&lt;==========

    private void setOCampoQFaltaPersistir(String valor) {
         oCampoQFaltaPersistir = valor;
    }

    @PreUpdate
    @PrePersist
    private void updateCodCfo() {
       setOCampoQFaltaPersistir(getCodCfo().getCodcfo()); // &lt;&lt;====
    } 

    @RemoteProperty
    @Column(name = "INDICE", columnDefinition = "NUMERIC", precision = 3, scale = 3, nullable = false)
    private Float indice;

    @RemoteProperty
    public FCfo getCodCfo() {
    return codCfo;
    }

    public void setCodCfo(FCfo codCfo) {
    this.codCfo = codCfo;
    }

    @RemoteProperty
    public Integer getCodTPrdFCfoIndice() {
        return codTPrdFCfoIndice;
    }

    public void setCodTPrdFCfoIndice(Integer codTPrdFCfoIndice) {
        this.codTPrdFCfoIndice = codTPrdFCfoIndice;
    }

    @RemoteProperty
    public TPrd getIdPrd() {
        return idPrd;
    }

    public void setIdPrd(TPrd idPrd) {
        this.idPrd = idPrd;
    }

    @RemoteProperty
    public Float getIndice() {
    return indice;
    }

    public void setIndice(Float indice) {
    this.indice = indice;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final GTPrdFCfoIndice other = (GTPrdFCfoIndice) obj;
        if (this.codTPrdFCfoIndice != other.codTPrdFCfoIndice && (this.codTPrdFCfoIndice == null || !this.codTPrdFCfoIndice.equals(other.codTPrdFCfoIndice))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.codTPrdFCfoIndice != null ? this.codTPrdFCfoIndice.hashCode() : 0);
        return hash;
    }

}
A

lavieri antes ta dando update agora nem isso. o que podera ser veja

@Entity
@Table(name = "_GTPRDFCFOINDICE")
@DataTransferObject
public class GTPrdFCfoIndice implements Serializable {

    @Id
    @RemoteProperty
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer codTPrdFCfoIndice;

    @RemoteProperty
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "CODCOLIGADA", updatable = true, insertable = true),
        @JoinColumn(name = "IDPRD", updatable = true, insertable = true)
    })
    private TPrd idPrd;

    @RemoteProperty
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "CODCFO", updatable = false, insertable = false),
        @JoinColumn(name = "CODCOLIGADA", updatable = false, insertable = false)
    })
    private FCfo codCfo;   

    @RemoteProperty
    @Column(name = "INDICE", columnDefinition = "NUMERIC", precision = 3, scale = 3, nullable = false)
    private Float indice;

    @RemoteProperty
    @Column(name = "CODCFO",length=25)
    private String oCampoQFaltaPersistir;

    @PreUpdate
    @PrePersist
    private void updateCodCfo() {
        setOCampoQFaltaPersistir(getCodCfo().getCodFCfo().getCodCfo());
    }
    
    @RemoteProperty
    public FCfo getCodCfo() {
        return codCfo;
    }

    public void setCodCfo(FCfo codCfo) {
        this.codCfo = codCfo;
    }

    @RemoteProperty
    public Integer getCodTPrdFCfoIndice() {
        return codTPrdFCfoIndice;
    }

    public void setCodTPrdFCfoIndice(Integer codTPrdFCfoIndice) {
        this.codTPrdFCfoIndice = codTPrdFCfoIndice;
    }

    @RemoteProperty
    public TPrd getIdPrd() {
        return idPrd;
    }

    public void setIdPrd(TPrd idPrd) {
        this.idPrd = idPrd;
    }

    @RemoteProperty
    public Float getIndice() {
        return indice;
    }

    public void setIndice(Float indice) {
        this.indice = indice;
    }

    public void setOCampoQFaltaPersistir(String valor) {
        oCampoQFaltaPersistir = valor;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final GTPrdFCfoIndice other = (GTPrdFCfoIndice) obj;
        if (this.codTPrdFCfoIndice != other.codTPrdFCfoIndice && (this.codTPrdFCfoIndice == null || !this.codTPrdFCfoIndice.equals(other.codTPrdFCfoIndice))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.codTPrdFCfoIndice != null ? this.codTPrdFCfoIndice.hashCode() : 0);
        return hash;
    }
}

tentei inserir veja na saida no glassfish

insert 
into
    _GTPRDFCFOINDICE
    (CODCOLIGADA, IDPRD, INDICE, CODCFO) 
values
    (?, ?, ?, ?)

Cannot insert the value NULL into column ‘CODCFO’, table ‘Corpore.dbo._GTPRDFCFOINDICE’; column does not allow nulls. INSERT fails.

L

O.o ... é pq os @PrePersist e @PreUpdate não estão configurados para funcionar...

como vc starta o seu hibernate ? ... agora não me pergunte como ligar esses bixos, eu só sei ligar de 1 forma, hehehe startando o config do hibernate por uma unicade de persistencia... fazendo

/**
     * Fabrica de Entity Managers
     */
    private static EntityManagerFactory entityManagerFactory = Beans.isDesignTime() ?
          null : Persistence.createEntityManagerFactory(&quot;hibernate_PU&quot;);


    /**
     * Instancia um novo {@link EntityManager}.
     * @return o novo {@link EntityManager}.
     */
    public static EntityManager newEntityManager() {
        return getEntityFactory().createEntityManager();
    }
 
    /**
     * Cria uma nova sessão do Hibernate.
     * @return a nova sessão do Hibernate.
     */
    public static Session newSession() throws IllegalStateException {
        return ((HibernateEntityManager)newEntityManager()).getSession();
    }

vc vai precisar ter um persistence.xml configurado.... se não souber configurar... vai no seu netbeans... clica com direito no seu projeto... escolhe NOVO > Outros... ai procura por Unidade de Persistencia

L

uma gambiarra q vai funcionar… sem o @PrePersist / @PreUpdate … é alterar o método set da chave composta

public void setCodCfo(FCfo codCfo) { this.codCfo = codCfo; updateCodCfo(); }

e vc tem certeza que esse seu método de set esta correto ? vc chama getCodCfo() tantas vezes O.o … setOCampoQFaltaPersistir(getCodCfo().getCodFCfo().getCodCfo());

A

e se ao inves de criar isso eu setar na “mão” esse campo que falta. funcionaria?

achei isso de vc http://www.guj.com.br/posts/list/125336.java

mas o que passar em “Sua_PU”

A

Lavieri:
uma gambiarra q vai funcionar… sem o @PrePersist / @PreUpdate … é alterar o método set da chave composta

public void setCodCfo(FCfo codCfo) { this.codCfo = codCfo; updateCodCfo(); }

e vc tem certeza que esse seu método de set esta correto ? vc chama getCodCfo() tantas vezes O.o … setOCampoQFaltaPersistir(getCodCfo().getCodFCfo().getCodCfo());

é assim mesmo pode confiar o ultimo chamado que é realmente o cod (string) o nome parece repetir mesmo hehehe

A

da uma olhadinha em um post anterior que eu disse que não ha mais a chave coposta agora tudo é foreignkey

L

arthurminarini:
e se ao inves de criar isso eu setar na “mão” esse campo que falta. funcionaria?

achei isso de vc http://www.guj.com.br/posts/list/125336.java

mas o que passar em “Sua_PU”

é o que te falei… vc precisa criar uma Unidade de Persistencia … se não souber fazer, o NetBeans faz pra vc… quando vc cria, ele pede o nome da PersistenceUnit = PU … ai vc poem o nome onde tem ali, “Sua_PU”

um exemplo de Unidade de persistencia

persistence.xml<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="hibernate_PU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>com.blogspot.java.i9se.jpa.Produto</class> <class>com.blogspot.java.i9se.jpa.Venda</class> <properties> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.connection.password" value="root"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost/javai9se"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> </properties> </persistence-unit> </persistence>

maepado para 2 classes… Produto e Venda… o nome dessa PU é “hibernate_PU”

a localização é na raiz do seu projeto de classes… dentro de uma pasta META-INF

L

n vi nenhum post anterior n… qual ?

Criado 12 de maio de 2009
Ultima resposta 18 de mai. de 2009
Respostas 32
Participantes 4