Hibernate gerando chave unica quando eu não preciso [RESOLVIDO]

6 respostas
zorba
bom dia pessoal tenho uma relação assim:
@Entity
public class LancamentoAula implements Serializable {

  @OneToMany
  private List<Licao> licoes = new ArrayList<Licao>();
e a classe Lição:
@Entity
public class Licao implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column (nullable = false)
	@NaoVazio(mensagem="Nome não pode ser vazio")
	private String codigo;
	
	@Column (length = 50, nullable = false)
	@NaoVazio(mensagem="Nome não pode ser vazio")
	private String descricao;
acontece que ele não deixa eu adiciona a mesma lição para diferentes lançamentos, e eu preciso adicionar, pq a lição é algo avulso, como um rotulo só. mas o hibernate cria isso aqui:
CONSTRAINT lancamentoaula_licao_licoes_id_key UNIQUE (licoes_id)
como impedir isso? ps: não posso colocar um objeto LançamentoAula na lição e fazer redundancia, pois a lição não está ligada a apenas um lançamento, mas a varios.

6 Respostas

O

Bom dia,

pelo que visualizei em seu código você está usando o campo ID como se fosse uma chave primária digamos deste modo,

você poderia criar uma key somente para incrementar o array, e outro campo que seria sua ID principal.

estou pensando em modelo de banco, quando você precisa informar uma chave igual no banco ou você criaria uma chave com outro campo, para somente quando os dois campos forem iguais ele não deixar inserir… ou criaria um campo auto_increment somente para “estar ali”, e utilizaria outro campo qualquer…

Sou novo na área de JAVA, mas pelo que eu intendi seria mais ou menos isso.

Desculpas se não foi de grande utilidade :smiley:

LucianoM86

Se um lançamento pode ter várias lições e uma lição pode estar associada a varios lançamentos, então você precisa de um relacionamento ManyToMany.

J
@OneToMany  
   private List<Licao> licoes = new ArrayList<Licao>();

Se entendi direito, o “problema” está nessa declaração. Tu disse que uma lição é avulsa, e pode estar associada a mais de um lançamento certo?
Mude a sua declaração de @OneToMany para @ManyToMany, que permite que uma lição seja associada com vários lançamentos, assim como um lançamento possua varias lições.

zorba

fiz exatamente isso. funcionou perfeitamente.

@ManyToMany(targetEntity=Licao.class,cascade={CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable( name="lancamento_licoes", joinColumns={@JoinColumn(referencedColumnName="id")}, inverseJoinColumns={@JoinColumn(referencedColumnName="id")} ) private List<Licao> licoes = new ArrayList<Licao>();

e na lição:

@ManyToMany( cascade={CascadeType.PERSIST, CascadeType.MERGE}, mappedBy="licoes", targetEntity=LancamentoAula.class) private List<LancamentoAula> lancamentos = new ArrayList<LancamentoAula>();

alex_braga

Pelo que eu entendi, a lição pode estar em vários lançamentos, então a sua associação tem que ser de Muitos para Muitos.
Como está no código que você postou o relacionamento Um para Muitos, Uma lista de lançamento tem várias lições, se você fizer o caminho inverso, a Lição está apenas em uma lista de Lançamentos, por isso a CONSTRAINT gerada pelo Hibernate.

Se voce estiver gerando o banco pelo Hiberntate, que no caso acredito que seja pelo fato da linha apresentada, ao gerar a Tabela LancamentoAula, é gerado a chave estrangeira licoes_id, nome da entidade+udersource+id, e esta Linha CONSTRAINT, justamente para garantir a integridade do banco.

Espero ter ajudado

zorba

chegou tarde, ja foi resolvido
abraços

Criado 23 de agosto de 2010
Ultima resposta 23 de ago. de 2010
Respostas 6
Participantes 5