2012-04-27 3 views
2

양방향 매핑에 대해 몇 가지 질문이 있습니다. - (1) Parking_Lot JPA 관계 매핑 개념

  • 직원 (*) - (1) 부서
  • 직원 (*) - (1) 프로젝트

    1. 직원 (1) :

      나는이 단체가
    2. 위의 관계에 대한 원본 및 대상 엔터티는 무엇입니까?

    3. ManyToOne 관계의 소유자는 무엇입니까? 주인이 많은 주체 또는 하나의 주체에 일까요?
    4. mappedBy은 소유자 측 또는 반대 측에 지정합니까?

    도와주세요.

    편집 :

    나는이 다음 표 : 프로젝트 - Proj_Client - 클라이언트 (많은 관계로 많은) 프로젝트 테이블을 유지하지만 클라이언트가 지속되지 않습니다. 뭐가 잘못 됐어?

    감사합니다.

  • 답변

    8
    @Entity 
    @Table(name="empoyee") 
    public class Employee { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Integer id; 
        @ManyToOne 
        @JoinColumn(name="department_id", referencedColumnName="id") 
        private Department department; 
        @ManyToOne 
        @JoinColumn(name="project_id", referencedColumnName="id") 
        private Project projects; 
        @OneToOne(mappedBy="employee") 
        private ParkingLot parkingLot; 
        //Other properties,constructors, getters and setters and so on 
    } 
    
    @Entity 
    @Table(name="department") 
    public class Department implements Serializable { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Long id; 
        @OneToMany(mappedBy="department") 
        private List<Employee> employees; 
        //Other properties,constructors, getters and setters and so on} 
    @Entity 
    @Table(name="parking_lot") 
    public class ParkingLot implements Serializable { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Long id; 
        @OneToOne 
        @JoinColumn(name="employee_id",referencedColumnName="id") 
        private Employee employee; 
        //Other properties,constructors, getters and setters and so on} 
    @Entity 
    @Table(name="project") 
    public class Project implements Serializable { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Long id; 
        @OneToMany(mappedBy="project") 
        private List<Employee> employees; 
        //Other properties,constructors, getters and setters and so on 
    } 
    

    관계가 단방향이면 실제로 소유 측면이없고 mappedBy 주석이 없습니다. 관계가 양방향 인 경우 mappedBy 주석이있는면이 있으며 다른면이 소유면입니다. 소유 측면은 관계를 소유하는 측면입니다. 따라서이 용어는 ParkingLot이 Employee를 소유하거나 Employee가 ParkingLot을 소유하는 것처럼 적용되는 것이 아니라, ParkingLot과 Employee 간의 관계가 Employee (또는 ParkingLot 아래 참조)의 소유와 유사합니다. ManyToOne의 경우 mappedBy가 없기 때문에 항상 관계를 소유하는 OneToMany 주석 아래에 지정된 엔터티입니다 (예 : 프로젝트 테이블이 모든 직원에게 외래 키를 가질 수 없기 때문에) 그래서 두 예제에서 ManyToOne/OneToMany 매핑은 어느 쪽이 관계를 소유하는지에 대한 선택권이 없습니다. 직원과 ParkingTot 우리는 선택의 여지가, 나는 ParkingLot을 choosed. 선택 사항이 주어지면 무엇이 중요합니까? 글쎄요, 가장 큰 차이점은 mappedBy가 패 퍼티 캐스케이드를가집니다. 어떤 테이블에 외래 키가 있는지 또는 관계가 자체 테이블에있는 경우에는 JPA가 모든 케이스 (@InverseJoinColumn 등)를 지원한다는 점에 유의하십시오.

    양방향 매핑의 경우 명확한 대상 및 매핑 소스가 없으므로 매핑하는 방식에 따라 다릅니다. 이 용어는 단방향 매핑에 더 적용 가능하며 원본 측은 물론 매핑을 사용하는 엔티티입니다 (대상 엔티티에 대한 가능한 지식)

    4) 해당 사항 없음 (ParkingLot과 Employee 단방향). 5) 관계의 소유자는 6) 역 측 "는 하나의 엔티티에"항상

    최종 참고 : 혼란 "측이 소유"예를 들어 우리가 부서 직원을 소유 있도록 설계 할 수 있고 경우 우리는 부서를 삭제하고 모든 직원도 삭제됩니다. @OneToMany(mappedBy="department")@OneToMany(mappedBy="department", cascade= CascadeType.REMOVE)으로 변경하면 "부서 엔티티가 자사의 직원 엔티티를 소유하고 있습니다"라고 말하면서 이해가되지만 관계는 여전히 Employee 엔티티가 소유하게됩니다.

    +0

    JPA가 매핑 (링크) 작업을하지만 공급자가 SQL 작업을 수행하기 때문에 소유 측면이 혼란 스럽습니다. 질의 : 저는 Employee와 프로젝트 사이의 많은 관계를 가지고 있으며 joinTable과 같은 모든 필요한 매핑을 가지고 있습니다. 테이블 클래스/엔티티를 조인하십시오. 이 경우 joinTable을 채우는 방법? – peterwkc

    +0

    계단식은 소유자 관계 또는 JPA 맵핑 및 SQL 조작에 어떤 영향을 미칩니 까? – peterwkc

    +0

    JoinTable에는 별도의 데이터/열이 아닌 관계 만 보유하고있는 한 별도의 클래스/엔티티가 필요하지 않습니다. 캐스케이드 질문 : http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Cascading – esej