在ORM中处理关系

时间:2011-09-30 09:54:31

标签: hibernate jpa orm jpa-2.0

在ORM中处理关系的最佳/常见解决方案(最佳实践)是什么?(从长期项目视图)?

1)例如我有Oracle HR模式。是否可以在可能的每个对象(实体)之间创建关系,或者仅在我现在真正需要的对象(以及将来的更改)之间创建关系?

@Entity
public class Employee {
    @Id
    private long employeeId;
    @ManyToOne((fetch = FetchType.LAZY)
    private Job job;
}

@Entity
public class Job {
    @Id
    private String jobId;
    @OneToMany(fetch = FetchType.LAZY)
    private List<Employee> employeeList;
}

2)我应该如何使用现有或新作业存储/设置新员工?我们有Employee实体和String jobId,还创建了关系Job job variable:

@Entity
public class Employee {
    @Id
    private long employeeId;
    private String jobId;
    @ManyToOne((fetch = FetchType.LAZY)
    private Job job;
}

最糟糕的解决方案是每次都设置两个参数:

Job job = new Job();
job.setJobId("JOB_01");
Employee employee = new Employee();
employee.setEmployeeId(1L)
employee.setJobId(job.getJobId());

更好的解决方案是在Employee类中重新实现setJobId()方法(还应该有一些代码来查明是否存在提到的Job):

public void setJobId(String jobId) {
    if (getJob() == null) {
        this.jobId = jobId;
        job = new Job();
        job.setJobId(jobId);
    } else {
        this.jobId = getJob().getJobId();
    }
}

1 个答案:

答案 0 :(得分:1)

如果您不需要关联,则无需添加关联。但请注意,即使它没有直接在Java代码中使用,关联可能仍然有用,只是为了能够在JPQL或条件查询中遍历它。

关于您的jobId字段,应该只从Employee实体中删除它。员工有工作,您可以使用employee.getJob().getId()访问其工作ID。您不应该能够设置员工的工作ID。相反,您应该获得或创建一份工作(在服务层中),并使用setJob(job)设置员工的工作。