2016-07-11 10 views
0

JPAアノテーションを使用して2つのJavaクラス間の集約関係を確立し、それらをデータベースに保持しようとしています。そのような言及hereとしてJPAアノテーションによる集約の関係

enter image description here

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

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

、集約関係は、単方向であり、したがって、それだけには片側をマッピングする必要があります。この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 
} 

注:あなたは一方向の多対1の関係をマップする方法SELECT t FROM Discount d INNER JOIN d.ticket t WHERE d.percentage >= :discountPercentage

+0

私はJPAの初心者ですが、もしその関係が単方向であれば、クラスの1つに注釈が1つだけ存在するはずです。そして私はそれがどちら側にあるべきかわからない。 – julian