2010-08-18 3 views
6

EJB 3.0 Entity-Bean (JPA)에서 단방향 관계를 만드는 방법은 무엇입니까?JPA (Entity-Bean)의 단방향 관계

예를 들어 고객은 주문에 대해 알고 있지만 주문에는 고객을위한 방법이 없습니다. (@OneToMany 또는 @OneToOne 또는 @ManyToMany)를 사용하여

감사

답변

15
여기

은 JPA 2.0을 사용하여 단방향 @OneToMany 관계를 만들어 주겠다고 방법은 다음과 같습니다

@Entity 
public class Customer { 
    @Id 
    @Column(name="cust_id") 
    private long id; 
    ... 
    @OneToMany 
    @JoinColumn(name="owner_id", referencedColumnName="cust_id") 
    private List<Order> order; 
    ... 
} 

@Entity 
public class Order { 
    @Id 
    @Column(name="order_id") 
    private long id; 
    ... 
} 

관계형 데이터베이스 :

고객 :

+---------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+---------+---------+------+-----+---------+-------+ 
| cust_id | int(11) | NO | PRI | NULL |  | 
+---------+---------+------+-----+---------+-------+ 

주문 다음과 같이

+----------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+----------+---------+------+-----+---------+-------+ 
| order_id | int(11) | NO | PRI | NULL |  | 
| owner_id | int(11) | NO | MUL | NULL |  | 
+----------+---------+------+-----+---------+-------+ 
+3

JPA 1.0은 ** JoinTable없이 단방향'OneToMany' 관계 ** **를 지원하지 않습니다 **. 즉, 단방향 'OneToMany' 모델로 위의 테이블 모델을 매핑 할 수 없으므로 정확하게 대답을 설명하지 못합니다. –

+0

파스칼은 정확합니다. 위의 예제는 JPA 2.0에서만 작동합니다. –

+0

@JoinColumn (name = "cust_id", referencedColumnName = "owner_id")이 맞습니까? – uuidcode

1

떠나 "단방향"옆 순간, 하나는 고객 주문 관계를 모델링 할 수 있습니다.

@Entity 
public class Customer { 
    // ... 
    @Id @GeneratedValue 
    int id; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer") 
    Set<Order> orders; 
    // ... 
} 

@Entity 
public class Order { 
    // ... 
    @ManyToOne(optional = false) 
    Customer customer; 
    // ... 
} 

여기서 각 주문에는 정확히 하나의 고객이 있다고 가정합니다. 데이터베이스에서 Order 테이블에는 Customer 테이블의 "id"열에 대한 외래 키가있는 "customer_id"열이 있습니다. DDL은 다음과 같습니다.

CREATE TABLE Customer (
    id INT NOT NULL, 
    ... 
    PRIMARY KEY (id) 
); 

CREATE TABLE Order (
    ... 
    customer_id INT NOT NULL, 
    ... 
    FOREIGN KEY (customer_id) REFERENCES Customer (id) 
); 

고객 클래스에는 주문 모음이 포함되어 있지만 실제로는 데이터베이스 구조에 영향을주지 않습니다. 고객에게 속한 주문을 검색/관리하는 편리한 방법 일뿐입니다. 예를 들어 고객의 "주문"회원을 모두 삭제하고 쿼리를 사용하여 대신 이러한 레코드를 가져올 수 있습니다.

내가하려는 점은 데이터베이스의 관점에서 볼 때 실제로는 "단방향"관계와 같은 것이 없다는 것입니다. 예제 reverendgreen을 사용하면 Order 객체에서 Customer 객체를 가져 오는 방법이없는 Java 클래스가 생성되지만 결과 데이터베이스 구조는 동일합니다 (열 이름의 사소한 차이는 무시함). 검색어를 통해 항상 특정 주문에 대한 고객을 찾을 수 있습니다.

+0

필자가 코멘트에서 말했듯이 결과 데이터베이스 구조 **는 JPA 1.0과 동일하지 않을 것이며, JPA 1.0은 단방향 "OneToMany"를 표현하기 위해 JoinTable을 필요로합니다. –

+0

답변을 읽은 후, 필자는 예제에서 언급 한 마크 업을 사용하기 위해 작업중인 프로젝트의 일부 엔티티를 업데이트했습니다. 그것은 잘 작동합니다 - 데이터베이스 구조는 동일하고 자식 클래스는 부모 클래스에 대한 직접적인 참조를 포함하지 않습니다. @JoinTable 주석이 필요하지 않았습니다. 다음과 같은 종속성 : hibernate-annotations 3.4.0.GA, hibernate-commons-annotations 3.1.0.GA, hibernate-core 3.3.2.GA, hibernate-entitymanager 3.4.0.GA, persistence-api 1.0. JPA 1.0 스펙을 뛰어 넘는 Hibernate의 경우인가요? –

+0

예, 정확하게 이것은 Hibernate에 고유합니다. ** JoinAll은 ** 표준 ** JPA 1.0에서'OneToOne'에 허용되지 않습니다.[@OneToMany에서 역 관계없이 조인 테이블없이 관련 참조를 제공 했습니까?] (http://stackoverflow.com/questions/2095998/onetomany-without-inverse-relationship-and-without-a-join-table/3517474) # 3517474) –