2016-03-29 18 views
0

İlk DAO programımı yazmaya çalışıyorum. Veritabanımda iki tablo oluşturdum: PROJECT ve MILESTONE. Normalde, proje ile dönüm noktası arasında bir birleşme ilişkisi var: Bir projenin birçok kilometre taşı olabileceği ancak bir dönüm noktasının kaçınılmaz olarak sadece TEK projeye etkilenebileceği.JAVA (DAO) ve SQL'de toplu ilişki ilişkisi

Ben iki ana soru var:

1) SQL tablolarda ben projectid bir kısıtlama (yabancı anahtar) eklemek zorunda anlamına ve bağdaştırılabilir kilometre taşı masaya yabancı anahtar? Şimdiye kadar, dönüm noktası tablosunda "projectid" adında bir sütun seçmeyi tercih ediyorum. Bence, bunu yaparsak basit olur.

2) bir dönüm noktası nesnesi oluşturduğunuzda, projectid specifiy için ZORUNLU var, bu yüzden bu yapıcı yazmaya çalıştı:

public Milestone (String name, String description, String projectId) throws SQLException, ClassNotFoundException { 
    this.name = name; 
    this.description = description; 

    ProjectDAOImpl proj = new ProjectDAOImpl(); 
    // "proj.findById(projectId)" is to verify if a real project exist having the specified id 
    if ((proj.findById(projectId))!= null) { 
     this.projectId = projectId; 
    } 
    else { 
     return null; //is it correct to do that in a constructor?? 
    } 
    } 

burada probleme ben bu durumu çevirebilir bilmiyorum edilir Java'da: "Belirtilen kimliğe sahip mevcut bir proje varsa, bu projeye ilişkin dönüm noktası bundan etkilenecektir. Değilse, kilometre taşı nesnesi oluşturulmayacaktır". Karşılık gelen bir proje yoksa, kurucuyu nesneyi yaratmamasını nasıl anlatabilirim?

cevap

1
  1. Oluşturucu değer döndüremiyor. Boş değer döndürmek yerine bir istisna (ör. IllegalArgumentException) atayabilirsiniz.
0

Her şeyden önce kurucu hiçbir şey döndüremez. Artı şu bağlantıyı deneyin ve değişiklikler yapmak bir istisna ... yapıcı

içinde muhtemelen geçerli bir istisna verebilir buna göre Is it good practice to make the constructor throw an exception?

@AutoWired 
ProjectDAOImpl proj; 

public Milestone (String name, String description, Integer projectId){ 
this.name = name; 
this.description = description; 
if ((proj.findById(projectId))!= null) throws NullPointException 
} 
projectId ve sizin gerektiği autowire Dao sınıfları IF gibi kimlikleri için

Kullanım Tamsayı veri türü Dao sınıfı, sınıf boyunca birçok kez çağrılmalıdır.

Ve ilk soruyla ilgili olarak, veritabanınızın muhtemelen bahsettiğiniz senaryo için böyle görünmesi gerektiğini düşünüyorum.

Project 

projectId (PK), 
// ...other fields 

Milestone 

milestoneId (PK), 
projectId (FK), 
// ...other fields