我正在尝试实现一对一 Hibernate 关系映射,并且我是 Hibernate 技术的新手。
我的两个实体类是
Employee
和Client
。 Client
应该有一个 employeeID
列作为数据库表中的外键,即 this 客户由 this 员工处理。
现在,有两个 JSP 页面,我将通过它们提交员工和客户的详细信息。首先,我将添加/提交员工 JSP。然后在客户端 JSP 页面上会出现一个选择框,其中包含
employeeID
s 作为其值。
我已经完成了我的JSP部分。但我对客户与员工之间的“一对一”映射关系表示怀疑。所以,我提供我的代码文件。 下面是我的代码:
员工班级:
public class RWEmp {
private int id;
private String strName;
private String strContactNum;
private String strDateOfJoining;
private String strDesignation;
public RWEmp(){
}
// getter/setters
}
public class RWClient {
private int id;
private String strName;
private RWEmp poc_emp; // point of contact employee as employee object
public RWClient(){
}
// getter/setters
}
employee.hbm.xml
是直接的,即没有关系。
但是客户与员工对象有has a
关系。
client.hbm.xml:
<hibernate-mapping>
<class name="com.rightwave.entities.RWClient" table="client_master">
<id name="id" type="int">
<generator class="increment" />
</id>
<property name="strName" type="string" column="cl_name" />
<many-to-one name="poc_emp" class="com.rightwave.entities.RWEmp" column="poc_emp" unique="true"></many-to-one>
</class>
</hibernate-mapping>
public class PersistEntities {
public void clientPersist() {
Session session=Factory.getSession();
Transaction tr=session.beginTransaction();
RWEmp rwEmp =new RWEmp();
rwEmp.setId(2); // this will come from jsp page <select> value. I am doubtful of this, explained below in question.
RWClient rwClient1=new RWClient("wso2",rwEmp);
session.save(rwClient1);
session.flush();
tr.commit();
session.close();
}
}
在此,我不确定这个蓝图是对还是错。
我可以设置
employeeID
吗,它将来自我的客户端 JSP 页面(来自
<select>
框中)。我很困惑,因为这里我只设置employeeID
,它必须已经存在才能成为客户端的有效外键。但是没有检查验证这个 employeeID
是否已经存在。 Employee
对象肯定会在客户端对象之前保存(来自employee.jsp
)。我的做法正确吗?
Client
表上声明一个特殊的外部标识符生成器,以从
Employee
表中获取主键值。添加 constrained="true"
以确保 Employee
存在。 <hibernate-mapping>
<class name="com.rightwave.entities.RWClient" table="client_master">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="foreign">
<param name="property">poc_emp</param>
</generator>
</id>
<one-to-one name="poc_emp" class="com.rightwave.entities.RWEmp"
constrained="true"></one-to-one>
<property name="strName" type="string" column="cl_name" />
</class>
</hibernate-mapping>