想象一下,我有一个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