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

5 respostas
R

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

D

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

R

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

D

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í

R

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 ??

H

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