Hibernate映射有两个表

时间:2011-01-05 14:58:30

标签: java hibernate orm

我正在尝试学习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
}

4 个答案:

答案 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();