2016-07-11 3 views
0

JPA 주석을 통해 두 Java 클래스 간의 집계 관계를 설정하여 데이터베이스에 유지하려고합니다. here 언급 JPA 주석을 통한 집계 관계

public class Ticket 
{ 
    private String ticketNo; 
    private Date releasedDate; 
    private boolean printed; 
} 

public class Discount 
{ 
    private String percentage; 
    private Date releasedDate; 
    private boolean printed; 
} 

enter image description here

같은 응집 관계는 단 방향성이며, 따라서 오직 한쪽을 매핑 할 필요가있다. 이 page에 의해 주어진 솔루션에서, 나는 해결책이 될 것이라고 생각 :

public class Discount 
    { 
     private String percentage; 
     private Date releasedDate; 
     private boolean printed; 
     @ManyToOne(name="TICKET_ID") 
     private Ticket ticket; 
    } 

그러나 일부 examples of aggregation에, 많은 측면 클래스는 한쪽 클래스 내부에 나타납니다. 따라서 나는 이것을 고려하고있다.

public class Ticket 
     { 
      private String ticketNo; 
      private Date releasedDate; 
      private boolean printed; 
      @OneToMany(mappedBy="ticket") 
      private List<Discount> discounts = new ArrayList<Discount>(); 
     } 

어느 옵션이 적절한 것인가?

+1

'그렇다면 나는 그것이 옳은 것인지 확신 할 수 없습니다. 왜 그것이 옳지 않다고 생각합니까? 단방향 및 양방향 관계 모두 합법적이고 타당합니다. – ujulu

+0

집계는 단방향입니다. 내 의심은 어느 쪽 (클래스)이 해당 주석을 가져야 하는지를 아는 것입니다. – julian

답변

1

이 될 수 @OneToMany 협회 쿼리를 넣어하지 않은 경우 당신은 언제나 @ManyToOne 예를 들어 같은 작업을 할 수 있어야한다 :

  • JoinColumn (데이터베이스 용어의 외래 키)은 관계의 여러 측면에 있어야합니다 (이것은 귀하의 경우 할인입니다).
  • @Id 주석도 필수입니다. 이 경우 ID는 지속성 공급자에 의해 자동으로 생성됩니다. 데이터베이스 순서 나 테이블 또는 다른 전략을 사용하는 경우 다시 정의 할 수 있습니다.
1

나에게 맞는 것처럼 보입니다. 할인 티켓이 있습니다. SELECT t FROM Ticket t WHERE t.discounts.percentage >= :discountPercentage과 같은 검색어로 액세스해야 할 경우 ticket.getDiscounts()과 같은 티켓에서 액세스 할 수있는 할인을 포함 할 수도 있습니다.

@Entity 
public class Ticket { 
    @Id 
    private String ticketNo; 
    private Date releasedDate; 
    private boolean printed; 

    @OneToMany(mappedBy = "ticket", fetch = FetchType.LAZY) 
    private List<Discounts> discounts; 
} 

@Entity 
public class Discount { 
     private String percentage; 
     private Date releasedDate; 
     private boolean printed; 

     @ManytoOne(name="TICKET_ID") 
     private Ticket ticket; 
} 

그러나, 나는 당신이 JSON 결과로이를 반환하거나 느리게 실수로 너무 많은 데이터를로드하는 경우 JSON에 너무 많은 데이터를 직렬화 문제를 일으킬 수있는이 같은 @OneToMany를 사용하지 않는 것이 좋습니다 것이다.

@Entity 
public class Ticket { 
    @Id 
    @GeneratedValue 
    private Long id; 

    private String ticketNo; 
    private Date releasedDate; 
    private boolean printed; 

    // getters and setters 
} 

@Entity 
public class Discount { 
    @Id 
    @GeneratedValue 
    private Long id; 

    private String percentage; 
    private Date releasedDate; 
    private boolean printed; 

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name = "TICKET_ID") // you can rename the join column 
    private Ticket ticket; 

    // getters and setters 
} 

참고 : 당신은 당신이 단방향 many-to-one 관계를 매핑하는 방법 SELECT t FROM Discount d INNER JOIN d.ticket t WHERE d.percentage >= :discountPercentage

+0

나는 JPA에 초보자이지만 관계가 단방향이라면 하나의 주석 만 클래스 중 하나에 있어야한다고 생각한다. 그리고 어느쪽에 있어야하는지 잘 모르겠습니다. – julian