2016-05-31 23 views
7

@JoinColumn hakkında çok şey okudum ama yine de onun arkasındaki fikri anlamadım.@JoinColumn nedir ve nasıl hazırda bekletiliyor?

Hasta Tablo

CREATE TABLE patient (
patient_id BIGINT NOT NULL, 
first_name VARCHAR(255) NOT NULL, 
last_name VARCHAR(255) NOT NULL, 
PRIMARY KEY(patient_id)); 

Araç Tablo

CREATE TABLE vehicles (
patient_id BIGINT NOT NULL, 
vehicle_id BIGINT NOT NULL, 
vehicle_manufacturer VARCHAR(255), 
PRIMARY KEY (vehicle_id), 
CONSTRAINT patienthasmanyvehicle FOREIGN KEY(patient_id) REFERENCES patient(patient_id)); 

Hasta Sınıf

@OneToMany(mappedBy = "patient") 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

Araç Sınıf

@ManyToOne 
@JoinColumn(name="patient_id") 
private Patient patient; 

nasıl Araç sınıfı kısmında karıştı,

Vehicle Class ---- Entity 
@JoinColumn(name="patient_id") ---- annotation 
private Patient patient ----field 

yazıyor mu arasındaki ilişki nedir; Araç Varlık bir yabancı anahtar Hasta adı geçen varlığı patient_id vardır. JoinColumn ismi parametresi her zaman bir yabancı anahtar veya Birincil Anahtar olmalıdır Do Araç Varlık masanın

bir sütun olarak patient_id ekle?

Bunu okuyordum ama hala kafam karışık. JPA JoinColumn vs mappedBy

cevap

1

Araç Sınıf ---- varlık @JoinColumn (ad = "patient_id") ---- açıklama özel hasta hasta ---- alan bir sütun patient_id üretecektir kod üzerinde

(a Hasta sınıfı birincil anahtarını gösterecektir Araç sınıfında yabancı anahtar).

MappedBy - Bu özellik bize bu ilişkinin Araç sınıfı tarafından yönetileceğini bildirir. Örnek. Eğer bir araç takarsak, kaskadi-tipi tüm/kaydedilmişse iki SQL enjekte edilecektir. 1. SQL, Hasta tablosuna ayrıntıları enjekte edecektir ve 2. SQL, araç tablasındaki araç ayrıntılarını, hasta sütunu takılı Hasta tuple'sı olan hasta sütunu ile enjekte edecektir.

+0

kullanabilirsiniz hastalar tabloda eşleştirilmiş doğrulayın ama için neden olduğuna ** patient_id (a FK ise oluşturulan sütun) ** ** Araç Tablosunda ** kodumu çalıştırdığımda herhangi bir değeri yok mu? – zbryan

+0

@zenlloyd Tek yönlü bir ilişki için Bu imkansız. Çift yönlü için bu normaldir. –

+0

Yabancı anahtarın (Araç tablosundaki hasta_kimliği) gerçekten hasta tablosunda eşlendiğini doğrulamanın bir yolu var mı? – zbryan

16

bir birleştirme tablosu vasıtasıyla bir ilişki

@Entity 
class Patient { 

    @OneToMany 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

} 

@Entity 
class Vehicle { 

} 

yabancı anahtar

@Entity 
class Patient { 

    @OneToMany 
    @JoinColumn(name = "patient_id") 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

} 

@Entity 
class Vehicle { 

} 

yabancı anahtar

@Entity 
class Patient { 

    @OneToMany(mappedBy = "patient") 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

} 

@Entity 
class Vehicle { 

    @JoinColumn(name="patient_id") 
    private Patient patient 

} 

Bu temel başlangıç ​​cihaz aracılığıyla bir çift yönlü bir ilişki ile tek yönlü bir ilişki @JoinColumn kullanım noktası.

( Vehicle tablodaki patient_id) yabancı anahtar gerçekten @JoinColumn(nullable = false)

@Entity 
class Vehicle { 

    @JoinColumn(name="patient_id", nullable = false) 
    private Patient patient 

} 
+0

, '@ OneToMany' öğesini belirttiğinizde bir örtülü' JoinColum' yok mu? Demek istediğim, birleşim tablosu aracılığıyla bir ilişkilendirme, bir yabancı anahtar aracılığıyla bir tek yönlü bir ilişki, yalnızca varsayılan bir coulmn adı ve el ile oluşturulmuş coulmn adından daha farklı mı? –

+0

@sql_dummy '@ JoinColumn' birleşim tablosu için kullanılmaz. İkinci soruyu anlamadım. Tek yönlü ve çift yönlü çağrışımlarınız için aynı veritabanı şemasına sahip olursunuz. –

+0

@OneToMany belirttiğimde örtülü olarak belirtilmemiş 'JoinColumn' anlamına mı geliyor? Şüphem var çünkü 'Debug' dosyasından geçiyorum. Gördüğümde, 'JoinColumn' ifadesini kullanıyorum. (Sanırım soruma cevap büyük olasılıkla "hayır", ama neden benzer "bağlama") –

İlgili konular