JPA 2.0: duvida OneToMany unidirecional e geração das tabelas no banco

5 respostas
Rafael_Nascimento

o livro Pro JPA 2 (Keith e Schincariol, p.101) diz que @OneToMany é unidirecional quando o a classe owner não define o atributo mappedBy, e a classe alvo não tem a notação @ManyToOne de volta. Seguindo o exemplo do livro, criei as entiddes Employee e Phone, em que um Employee pode ter varios Phones:

@Entity
@Table(name="employee")
public class Employee implements Serializable {
	   
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID_EMP")
	private Integer id;
	
	@Column(name="DES_NOME")
	private String name;
	
	@Column(name="VAL_SALARY")
	private Double salary;           
	
	@OneToMany						//unidirectional one-to-many
	@JoinTable(name="employee_phone",
				joinColumns=@JoinColumn(name="ID_EMP"), 
				inverseJoinColumns=@JoinColumn(name="ID_PHONE"))
	private Collection<Phone> phones;
	
	...
}	

@Entity
@Table(name="phone")
public class Phone implements Serializable {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID_PHONE")
	private Integer id;
	
	@Column(name="DES_NUMBER")
	private String number;
...
}

a joinTable gerada no banco não possui chave primaria, e é formada pelos campos ID_PHONE e ID_EMP. O problema é que a coluna ID_PHONE está sendo gerada com a constraint unique, o que impede Employees diferentes de terem o mesmo Phone.
No exemplo do livro, essa constraint não aparece e a chave primaria é composta.

Alguém sabe como gerar a join table corretamente, sem essa constraint e com a chave primária composta pelos dois campos ?? :smiley:

obrigado

5 Respostas

drsmachado

Camarada, o conceito de um para muitos é

O mapeamento está correto. Afinal, um Employee pode ter vários Phones, mas cada Phone pertence a um único Employee.

Perceba o problema, Phone e Employee são relacionados em muitos para muitos, ou seja, suponha que haja 2 Employee que morem juntos, o Phone será o mesmo, desta forma, cada Employee pode ter vários Phone e cada Phone pode pertencer a mais de um Employee.

Neste caso, em específico, teríamos uma join table com chave composta e sem constraint unique, afinal, 0 ou mais Employee poderiam ter o mesmo Phone e cada Employee poderia ter vários Phone

Rafael_Nascimento

valeu camarada, é que eu estava seguindo o exemplo do livro, e lá estava do jeito que postei. De fato, se eu alterar o @OneToMany de Employee para @ManyToMany, gera do jeito que eu queria

obrigado

drsmachado

Rafael Nascimento:
valeu camarada, é que eu estava seguindo o exemplo do livro, e lá estava do jeito que postei. De fato, se eu alterar o @OneToMany de Employee para @ManyToMany, gera do jeito que eu queria

obrigado


Nem tudo o que está nos livros está certo.
Imagina o que está na internet…

Mas, vai lá camarada, boas.
Qualquer coisa nos manda aí

Rafael_Nascimento

drsmachado, só, mais uma dúvida. Fiz a alteração e o código ficou assim:

@Entity  
@Table(name="employee")  
public class Employee implements Serializable {  
         
    @Id  
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    @Column(name="ID_EMP")  
    private Integer id;  
      
    @Column(name="DES_NOME")  
    private String name;  
      
    @Column(name="VAL_SALARY")  
    private Double salary;             
      
    @ManyToMany                      //unidirectional  
    @JoinTable(name="employee_phone",  
                joinColumns=@JoinColumn(name="ID_EMP"),   
                inverseJoinColumns=@JoinColumn(name="ID_PHONE"))  
    private Collection<Phone> phones;  
      
    ...  
}     
  
@Entity  
@Table(name="phone")  
public class Phone implements Serializable {  
  
    @Id  
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    @Column(name="ID_PHONE")  
    private Integer id;  
      
    @Column(name="DES_NUMBER")  
    private String number;  
...  
}

a join table gerada vem sem chave primaria. Teria como gerar a join table com uma chave composta por ID_PHONE e ID_EMP, sem ter que criar uma nova classe de ID em java ??

Hebert_Coelho

Do modo como está, vc não precisa de uma classe ID em java. Pq vc precisaria?

Criado 22 de dezembro de 2011
Ultima resposta 22 de dez. de 2011
Respostas 5
Participantes 3