我正在尝试学习Hibernate,我可以使用Single Class和Single Table创建一些简单的CRUD操作。我刚刚阅读了Hibernate Doc和一些在线教程。
但我对如何使用两个表定义这种关系存在问题。我基本上有一个具有这种结构的Employee表。
CREATE TABLE EMPLOYEE
(
EMP_ID VARCHAR(10) NOT NULL,
EMP_FIRST_NAME VARCHAR(30) NOT NULL,
EMP_LAST_NAME VARCHAR(30) NOT NULL,
STATUS_ID INT NOT NULL,
PRIMARY KEY (EMP_ID)
);
STATUS_ID字段引用另一个表。 STATUS_DESC可以是'PERMANENT','CONTRACTUAL','ON-DEMAND'
CREATE TABLE EMP_STATUS
(
STATUS_ID VARCHAR(10) NOT NULL,
STATUS_DESC VARCHAR(100) ,
PRIMARY KEY (STATUS_ID)
);
我正在考虑拥有这样的Entity类。现在我的目标是返回具有状态的Employee对象列表,但我不知道如何继续这样做。
@Entity
public class Employee{
//other private instance
private EmployeeStatus empStatus;
//getters and setters.
}
public class EmployeeStatus{
private int statusID;
private String statusDesc;
//getters and setters
}
答案 0 :(得分:4)
你想知道如何映射吗?多对一?
Employee.java
@Entity
public class Employee{
//other private instance
@JoinColumn(name = "empStatus", referencedColumnName = "yourColName")
@ManyToOne(optional = false)
private EmployeeStatus empStatus;
//getters and setters.
}
别忘了更改“referencedColumnName”值......
EmployeeStatus.java
@Entity
public class EmployeeStatus{
@Id //this is your pk?
private int statusID;
private String statusDesc;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "empStatus", fetch = FetchType.LAZY) //or EAGER
private List<Employee> empList;
//getters and setters
}
答案 1 :(得分:2)
要在两个表之间创建关系,您需要决定:
这种关系是双向的吗?也就是说,状态是否了解员工?如果不是那么它是单向的。在这种情况下,您可以在Employee类上添加注释,如下所示:
@ManyToOne
@JoinColumn(name = "status")
private EmployeeStatus empStatus;
您可以添加一些其他选项。
答案 2 :(得分:1)
您可以执行您正在执行的操作,但我建议,如果状态只能是三个值中的一个,请使用三个值创建一个枚举。不需要单独的表格。
这样做的缺点是你需要创建一个hibernate自定义类型(代码在wiki上)以支持持久的枚举。
更简单的答案是不使用辅助表,只需将状态保存为域对象上的字符串即可。您可以在模型上放置业务逻辑,以确保String位于可接受值的列表中。
如果你真的想使用两个实体之间的关系,那么请查看关于many-to-one关系的hibernate文档。
答案 3 :(得分:0)
您可以使用HQL来查询实体。像这样
Query q = s.createQuery("from Employee as e where e.empStatus = :status");
q.setParameter("status", status);
List emps= q.list();