[JPA] Problema com relacionamento ManyToOne -> OneToMany

Ahe galera!

Estou montando um sistema para a facul com JPA etc.
Pulando para o problema, o caso é o seguinte: Tenho um objeto Requisito que possui diversos atributos. Quando vou persistir um novo requisito com novos atributos, o hibernate executa o insert do requisito, um insert para cada atributo e por fim, executa um ultimo insert associativo e é nesse que da o erro. Acredito que o erro esta na maneira que anotei o relacionamento.

Grato desde já.

@Entity
@Table(name = "tbl_requisito")
public class Requisito extends Entidade {

	/**
	 * Numero do requisito
	 */
	@Id
	@Column(name = "num_requi")
	@GeneratedValue(strategy = GenerationType.AUTO)
	protected int numero;

	@OneToMany(targetEntity = AtributoRequisito.class, cascade = CascadeType.ALL)
	@JoinTable(name = "tbl_atributo", joinColumns = @JoinColumn(name = "num_requi"), inverseJoinColumns = @JoinColumn(name = "num_atrib"))
	protected Collection<AtributoRequisito> atributos;

	// GETS e SETS

}
@Entity
@Table(name = "tbl_atributo")
public class AtributoRequisito extends Entidade {
	/**
	 * Numero do atributo no banco de dados
	 */
	@Id
	@Column(name = "num_atrib", nullable = false)
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int numero;


	/**
	 * Requisito que possui o atributo
	 */

	@ManyToOne(targetEntity = Requisito.class, optional = true, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
	@JoinColumn(name = "num_requi", nullable = true)
	private Requisito requisito;

	// GETS e SETS

}

Comandos Gerados:

    insert 
    into
        tbl_requisito
        (num_requi, dat_regis, ind_ativo, cod_user, num_estad, tex_local_arqui, nom_requi, nom_arqui, num_proje, num_funci, num_tipo_requi) 
    values
        (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

    insert 
    into
        tbl_atributo
        (num_atrib, dat_regis, ind_ativo, cod_user, num_requi, num_atrib_tipo, num_valor) 
    values
        (default, ?, ?, ?, ?, ?, ?)

    into
        tbl_atributo
        (num_requi, num_atrib) 
    values
        (?, ?)

O ultimo comando que da problema. Não deveria ser executado.

Diagrama das tabelas em anexo.

Esse último insert está aparecendo porque você usou a anotação @JoinTable, que normalmente só se justifica em relacionamentos ManytoMany, onde existe a necessidade de uma tabela de ligação que guarda as chaves primárias dessas tabelas. Você usou esse comando informando que o nome da tabela é “tbl_atributo” e ele tenta fazer um insert das chaves primárias nessa tabela, mas pelo esquema que você passou ela não existe, daí o erro.

Já que o relacionamento é ManytoOne, não há necessidade dessa tabela de ligação, remova o @JoinTable, use apenas o @JoinColumn que deve funcionar.

Valeu! Consegui fazer apenas com o JoinColumn e adicionando um parametro no @OneToMany.

Gostaria de saber, como eu faço agora se meu objeto tiver 2 campos como chave no Requisito? Terei que criar um Embeddable?

Meu código atual:

@Entity
@Table(name = "tbl_requisito")
public class Requisito extends Entidade {
	

	/**
	 * Numero do requisito
	 */
	@Id
	@Column(name = "num_requi")
	@GeneratedValue(strategy = GenerationType.AUTO)
	protected int numero;

	//!!!! QUERO ADICIONAR UMA NOVA CHAVE NUMERICA AQUI!!!
	
	@OneToMany(targetEntity = AtributoRequisito.class, cascade = CascadeType.ALL, mappedBy = "requisito")
	protected Collection<AtributoRequisito> atributos;
	
	// GETS e SETS
	
}
@Entity
@Table(name = "tbl_atributo")
public class AtributoRequisito extends Entidade {
	/**
	 * Numero do atributo no banco de dados
	 */
	@Id
	@Column(name = "num_atrib", nullable = false)
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int numero;

	/**
	 * Requisito que possui o atributo
	 */

	@ManyToOne(targetEntity = Requisito.class, optional = true, fetch = FetchType.EAGER)
	@JoinColumn(name = "num_requi", nullable = true, referencedColumnName = "num_requi")
	private Requisito requisito;
	
	// GETS E SETS
}

Sim, você tera que usar @Embeddable.
veja em: http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#d0e1517