想象一下,我有一個MySQL數據庫,其中有兩個表patient
和medicine
。我已經在下面顯示了他們的列。關係處理:Hibernate vs JDBC
患者
idPatient (int) (primary key)
first_name (varchar)
last_name (varchar)
醫學
idMedicine (int) (primary key)
idPatient (int) (foreign key)
drug_name (varchar)
請注意Medicine
表確實有Patient
表的foriegn關鍵。現在
,如果我用純JDBC,我將做以下爲Medicine
和Patient
表創建一個bean
PatientBean
類
public class PatientBean
{
private int idPatient;
private String first_name;
private String last_name;
public void setIdPatient(int idPatient)
{
this.idPatient = idPatient;
}
public int getIdPatient()
{
return idPatient;
}
public void setFirstName(String first_name)
{
this.first_name = first_name;
}
public String getFirstName()
{
return first_name;
}
public void setLastName(String last_name)
{
this.last_name = last_name;
}
public String getLastName()
{
return last_name;
}
}
`MedicineBean` class
public class MedicineBean
{
private int idMedicine;
private int idPatient;
private String drug_name;
public void setIdMedicine(int idMedicine)
{
this.idMedicine = idMedicine;
}
public int getIdMedicine()
{
return idMedicine;
}
public void setIdPatient(int idPatient)
{
this.idPatient = idPatient;
}
public int getIdPatient()
{
return idPatient;
}
public void setDrugName(String drug_name)
{
this.drug_name = drug_name;
}
public String getDrugName()
{
return drug_name;
}
}
但是如果我反向設計我的數據庫休眠使用像NetBeans這樣的工具將生成POJO文件,爲Hibernate映射等,我可以期待類似下面的內容。
PatientBean
類
public class PatientBean
{
private int idPatient;
private String first_name;
private String last_name;
private MedicineBean medicineBean;
public void setIdPatient(int idPatient)
{
this.idPatient = idPatient;
}
public int getIdPatient()
{
return idPatient;
}
public void setFirstName(String first_name)
{
this.first_name = first_name;
}
public String getFirstName()
{
return first_name;
}
public void setLastName(String last_name)
{
this.last_name = last_name;
}
public String getLastName()
{
return last_name;
}
public void setMedicineBean(String medicineBean)
{
this.medicineBean = medicineBean;
}
public String getMedicineBean()
{
return medicineBean;
}
}
MedicineBean
類
public class MedicineBean
{
private int idMedicine;
private int idPatient;
private String drug_name;
private Set<PatientBean> patients = new HashSet<PatientBean>(0);
public void setIdMedicine(int idMedicine)
{
this.idMedicine = idMedicine;
}
public int getIdMedicine()
{
return idMedicine;
}
public void setIdPatient(int idPatient)
{
this.idPatient = idPatient;
}
public int getIdPatient()
{
return idPatient;
}
public void setDrugName(String drug_name)
{
this.drug_name = drug_name;
}
public String getDrugName()
{
return drug_name;
}
public void setPatients(Set<PatientBean>patients)
{
this.patients = patients;
}
public Set<PatientBean> getPatients()
{
return patients;
}
}
不僅如此,Hibernate也將映射的關係式(一對一,一對多,多對一)在xml文件裏面。但是在JDBC中我們根本不關心它們,它們只是用相同的方式處理的外鍵。
所以我的問題是,爲什麼這種差異?我相信Hibernate所做的大部分操作都是無用的,只是使用CPU。例如,當我們調用getAllMedicines()
方法時,試圖檢索Patient
表中的patients
列表。在99%的情況下,我們只需要所有藥物而不是患者名單,如果我們需要我們可以加入並得到它!
那麼背後的原因是什麼?否則,我們是否也應該爲JDBC保持相同的行爲?
「患者」列表通常會被延遲加載,這意味着它只會在需要時讀取數據。第二種方式包含您的數據,正如您通常將其寫入面向對象程序 –
@ScaryWombat:是的,我知道。我的問題是爲什麼我們在JDBC中不這樣做?我看到它簡直沒用。 –
您不在JDBC中執行此操作的唯一原因是您*不在JDBC中執行此操作。 *您完全可以完全控制自己想要做什麼,所以您可以通過用PatientBean病人替換MedicineBean的'int idPatient',並向PatientBean添加一個'List藥物「來完成。根據它們的使用方式,這是另一種方式。 –
Andreas