Hibernate Annotations - Chave Composta / @ManyToOne

Olá,

Estou com um problema no mapeamento de chaves compostas utilizando hibernate annotations

Antes de utilizar annotations, eu mapeava a entidade ItemTabela que contem como chave composta um objeto Produto e um objeto Tabela.


<class name="entidades.ItemTabela" table="prd_item_tabela">

<composite-id>
           <key-many-to-one name="produto" column="codProduto" class="entidades.Produto"/>
           <key-many-to-one foreign-key="codTabelaPreco" name="tabelaPreco" column="codTabelaPreco" class="entidades.TabelaPreco"/>
</composite-id>

<property name="vlrProduto" type="java.lang.Float">

Ai alterando para annotations mapeie as entidades das seguintes formas:

PRODUTO.JAVA


@Entity
@Table(name="prd_produto")
@Proxy(lazy=false)
public class Produto {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long codProduto;
	@ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
	@JoinColumn(name="codSubfamilia",insertable=true,updatable=true,nullable=false)
	@Fetch(FetchMode.JOIN)
	private Subfamilia subfamilia;
	private String dscProduto;

        ... (outros atributos e getters and setters)

TABELA_PREÇO

@Entity
@Table(name="prd_tabela_preco")
@Proxy(lazy=false)
public class TabelaPreco {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long codTabelaPreco;
	
	@Temporal(TemporalType.DATE)
	private Date datInicio;
	@Temporal(TemporalType.DATE)
	private Date datFim;
	private Boolean indAtiva;
	
	@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
	private List<ItemTabela> itemTabelas = new ArrayList<ItemTabela>(0);

        ...

ITEM_TABELA

@Entity
@Table(name="prd_item_tabela")
@AssociationOverrides({
  @AssociationOverride(name="id.produto", joinColumns = @JoinColumn(name="codProduto")),
  @AssociationOverride(name="id.tabelaPreco", joinColumns = @JoinColumn(name="codTabelaPreco"))
})
@IdClass(ItemTabelaPK.class)
@Proxy(lazy=false)
public class ItemTabela {

	
	@EmbeddedId
	private ItemTabelaPK id;
	
	private Float vlrProduto;

...

ITEM_TABELA_PK


@Embeddable
public class ItemTabelaPK implements Serializable {

	private static final long serialVersionUID = 1L;

	@ManyToOne
	private Produto produto;
	
	@ManyToOne
	private TabelaPreco tabelaPreco;

...

O erro que dá é o seguinte:

Caused by: org.hibernate.AnnotationException: Unable to find properties (produto, tabelaPreco) in entity annotated with @IdClass:br.com.id5.websad.produtos.entidades.ItemTabela

Ja tentei solucionar de diversas formas esse problema

como em outro relaciomento que tenho que utiliza chave composta PedidoProduto (e também não funciona)

@Entity
@Table(name="ped_pedido_prd_produto")
@Proxy(lazy=false)
public class PedidoProduto {
    
	@Id
	private PedidoProdutoId id;
	
	@Embeddable 
	public class PedidoProdutoId implements Serializable{

		
		private static final long serialVersionUID = 1L;
		
		@Column(name="codPedido")
		private Long codPedido;
		@Column(name="codProduto")
		private Long codProduto;
				
		public Long getCodPedido() {
			return codPedido;
		}
		public void setCodPedido(Long codPedido) {
			this.codPedido = codPedido;
		}
		public Long getCodProduto() {
			return codProduto;
		}
		public void setCodProduto(Long codProduto) {
			this.codProduto = codProduto;
		}
		
	}
	
        //chave composta
	@ManyToOne(fetch = FetchType.EAGER)  
	@JoinColumn(name="codPedido", insertable = false, updatable = false)  
	private Pedido pedido;
	
	//chave composta
	@ManyToOne(fetch = FetchType.EAGER)  
	@JoinColumn(name="codProduto", insertable = false, updatable = false)  
	private Produto produto;

da forma acima da o seguinte erro:

org.springframework.orm.hibernate3.HibernateSystemException: ids for this class must be manually assigned before calling save()

tb com e sem, AssociationOverrides, tou apanhando feio…

Atenciosamente,
Dirceu

Olá,

No lugar de @EmbeddedId coloque simplesmente @id e remova também a anotação: @IdClass(ItemTabelaPK.class)

:okok:

[quote=“marcossousa”]Olá,

No lugar de @EmbeddedId coloque simplesmente @id e remova também a anotação: @IdClass(ItemTabelaPK.class)

:okok:[/quote]

Valeu Marcos, Funcionou blz, mt obrigado, há alguns dias eu tava travado nisso

Abaixo segue o codigo do Relacionamento de duas tabelas onde a tabela de Relacionamento ItemPossui, possui uma chave composta e atributos.

Relacionamento: Tabela_Preco - ItemTabela - Produto

TabelaPreco.Java

@Entity
@Table(name="prd_tabela_preco")
@Proxy(lazy=false)
public class TabelaPreco {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long codTabelaPreco;
	
	@Temporal(TemporalType.DATE)
	private Date datInicio;
	@Temporal(TemporalType.DATE)
	private Date datFim;
	private Boolean indAtiva;
	
	@OneToMany(cascade=CascadeType.ALL)
	private List<ItemTabela> itemTabelas = new ArrayList<ItemTabela>();

	public TabelaPreco() {
	}

        //gets e sets abaixo

[b]ItemTabela.java[b]

@Entity
@Table(name="prd_item_tabela")
@Proxy(lazy=false)
public class ItemTabela {

	
	@Id
	private ItemTabelaPK id = new ItemTabelaPK();
	
	private Float vlrProduto;

        //getters e setters abaixo

ItemTabelaPK.java

@Embeddable
public class ItemTabelaPK implements Serializable {

	private static final long serialVersionUID = 1L;

	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="codProduto")
	private Produto produto;
	
	@ManyToOne(fetch = FetchType.EAGER)  
	@JoinColumn(name="codTabelaPreco") 
	private TabelaPreco tabelaPreco;

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public TabelaPreco getTabelaPreco() {
		return tabelaPreco;
	}

	public void setTabelaPreco(TabelaPreco tabelaPreco) {
		this.tabelaPreco = tabelaPreco;
	}
	
}

Mais uma vez obrigado!
Att. Dirceu