【问题标题】:Working with relations in ORM在 ORM 中处理关系
【发布时间】:2011-09-30 09:54:31
【问题描述】:

在 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) 我应该如何使用现有或新工作存储/设置新员工?我们有带有字符串 jobId 的 Employee 实体,并且还创建了关系 Job 工作变量:

@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();
    }
}

【问题讨论】:

    标签: hibernate jpa orm jpa-2.0


    【解决方案1】:

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

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

    【讨论】:

    • 还有一些很好的解决方案如何存储新员工和现有工作?因为当我调用 job.setJobId("AC_ACCOUNT") 和 employee.setJob(job) 时,系统会尝试触摸(存储新工作或更新现有工作)作业表。
    • 从数据库(使用 em.find 或 em.getReference 或 session.get 或 session.load)获取具有给定 ID 的作业,并在员工中设置此作业。
    • 你不应该创建一个新的 Job 实例并自己设置它的 ID 来引用一个已经存在的 Job。您应该从数据库中获取它。否则,Hibernate 认为您在员工中设置的工作是必须与员工一起创建的新工作。
    • 那你的映射有问题。问另一个问题,您在哪里显示您的实体及其映射注释,以及用于持久化您的员工的代码。
    • 它应该可以使用级联。您的映射还有另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多