Artur Świerc Programista PHP/Java
Temat: JPA oraz @OneToMany
WitamDla przykładu mam tabelki (w skróconej formie)
Customer: ID | FIRST_NAME | LAST_NAME
Phone: ID | NUMBER | CUSTOMER_ID
Chciałbym teraz zrobić relację jeden do wielu - wiadomo jeden Customer ma wiele telefonów, z tym że CUSTOMER_ID jest w tabelce Phone.
Problem w tym, że chciałbym aby encja Customer była stroną właścicielską tego modelu - czyli wykonując metodę "persist" na Customer, w bazie zapisywała by się jednocześnie encja Phone.
W książce z której się uczę jest następujący przykład:
Encja Phone:
@Entity
public class Phone implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private int id;
@Column(name="NUMBER")
private String number;
...
Encja Customer:
@Entity
public class Customer implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private int id;
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name="CUSTOMER_ID")
private Collection<Phone> phoneNumbers = new ArrayList<Phone>();
public Collection<Phone> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(Collection<Phone> phones) {
this.phoneNumbers = phones;
}
...
Przykład z książki jest chyba jakiś lewy, wg mnie adnotacja @JoinColumn w encji Customer wskazuje na kolumnę CUSTOMER_ID w tabeli Customer, a nie w tabeli Phone.
Do tego kompilator sypie wyjątkami:
Exception Description: @OneToMany for attribute name [phoneNumbers] in entity class [class com.titan.domain.Customer] should not have @JoinColumn(s) specified. In the case where the @OneToMany is not mapped by another entity (that is, it is the owning side and is uni-directional), it should specify (optional through defaulting) a @JoinTable.
...
Mógłbym to zrobić w inny sposób, czyli dodając @ManyToOne oraz @JoinColumn(name="CUSTOMER_ID") w encji Phone, jednocześnie mapować to pole w encji Customer. Ale wtedy encja Customer chyba straciła by status encji właścicielskiej (?).
Pozdr.
/ps/ Książka to "Enterprise JavaBeans 3.0"Artur Świerc edytował(a) ten post dnia 21.11.09 o godzinie 11:19