在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();
}
}
答案 0 :(得分:1)
如果您不需要关联,则无需添加关联。但请注意,即使它没有直接在Java代码中使用,关联可能仍然有用,只是为了能够在JPQL或条件查询中遍历它。
关于您的jobId字段,应该只从Employee
实体中删除它。员工有工作,您可以使用employee.getJob().getId()
访问其工作ID。您不应该能够设置员工的工作ID。相反,您应该获得或创建一份工作(在服务层中),并使用setJob(job)
设置员工的工作。