[HIBERNATE ANNOTATIONS] COMPOSITE-KEY com Many-to-One

2 respostas
DirceuSobrinho

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

2 Respostas

mariolfigueiredo

Dirceu…estou com o mesmo problema

gostaria de saber como vc resolveu o seu problema…

Minhas Tabelas

1 - Pedido
id_pedido (pk)

2 - ItensPedido
id_pedido (pk)
id_pedido_item (pk)

já fiz em mapeamento xml…usando anotação não está funcionando

abraço

T

No link abaixo tem uma referencia legal do mapeamento hibernate usando anotação.

Criado 12 de novembro de 2007
Ultima resposta 25 de abr. de 2009
Respostas 2
Participantes 3