2010-05-10 16 views
7
Create Table A (
ID varchar(8), 
Primary Key(ID) 
); 

Create Table B (
ID varchar(8), 
A_ID varchar(8), 
Primary Key(ID), 
Foreign Key(A_ID) References A(ID) 
); 

Yukarıdaki SQL deyimlerini kullanarak iki tablo oluşturduğum ve B sınıfı için Entity sınıfı oluşturmak istediğim için şu üye niteliklerim var:Java JPA @OneToMany @ManyToOne karşılık mı gerekiyordu?

@Id 
@Column(name = "ID", nullable = false, length = 8) 
private String id; 
@JoinColumn(name = "A_ID", referencedColumnName = "ID", nullable = false) 
@ManyToOne(optional = false) 
private A AId; 

A sınıfında Bire-bir ilişkiye karşılık vermem gerekiyor mu?

@Id 
@Column(name = "ID", nullable = false, length = 8) 
private String id; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "AId") 
private List<B> BList; //<-- Is this attribute necessary? 

@ManyToOne için bir karşılıklı @OneToMany'a sahip olmak gerekli veya iyi bir fikir mi? Tasarım kararını şimdi @OneToMany açıklamalı öznitelikten çıkarmaya karar verirsem, bu bana daha da fazla ısırır mı?

cevap

11

@ManyToOne için bir @OneToMany reciprocal sahip olmak gerekli veya iyi bir fikir mi?

Hayır, zorunlu değil, tamamen tasarım kararı. Bütün soru ... Bu (yani tek yönlü bir ilişki) istiyor musunuz edilir:

uni-directional

Ya da bu (yani çift yönlü bir ilişki):

bi-directional

ise A'dan Bs almanıza gerek yoktur, ardından A tarafındaki bs özniteliğini ve OneToMany öğesini atlayabilirsiniz.

Tasarımın şimdi @OneToMany ek açıklamalı özniteliğini dışarıda bırakma kararını verirseniz, daha da fazla ısırmaya döneceğim.

Hayır ve ihtiyacınız olduğunu fark ederseniz daha sonra ekleyebilirsiniz.

+0

1 ve @Pascal Thivent kontrol edin: Bunu gerekirse işaret için daha sonra ekleyebilirsiniz: bu benim asıl sorun oldu. – bguiz

+0

Genellikle tek yönlü eşlemelerden mümkün olduğunca kaçınmaya çalışıyorum. Sadece datebase'deki bir şey ayrı bir birleştirme tablosuyla modellendiğinden (her ne sebeple olursa olsun) nesne modelimin de aynı şeyi yapması gerektiği anlamına gelmez. Yukarıdaki örnekte, bir OneToOne-Mapping tek yönlü çözüm için yeterli olacaktır (tabi ki bu, etki alanına bağlı olmalıdır). – lostiniceland

2

İsteğe bağlılar. Bunları kullanmak istemiyorsanız onları modelinize eklemenize gerek yoktur.

böyle koleksiyonları oldukça büyük hale gelebilir ve katmanlar Persistance çoğu bu çok iyi işlem yapmadığı için ben hiç ters eşleme önlemek için sugguest ederim. Çoğu durumda, bu koleksiyonlarla ilgili olarak zaten yüklenen/yönetilen varlıkların eklenmesi/kaldırılmasıyla başa çıkmak zorunda kalırsınız. Bu yüzden sadece sizin için işleri daha kolay hale getiriyorsa ekleyin.

+0

+1 @Daniel Bleisteiner: Onları işlemek için gereken kod miktarı oldukça kasıtlı olabilir. Tavsiye için teşekkürler – bguiz