【问题标题】:JPA Persist RelationshipsJPA 保持关系
【发布时间】:2016-06-06 17:29:10
【问题描述】:

如果我有以下具有多个外键关系的实体对象,当我没有在请求中取回关系对象时如何处理表单提交。

实体可能看起来像这样:

@Entity
@Table(name = "employee")
public class Employee implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "middle_name")
private String middleName;

@Column(name = "login_id")
private String loginId;

@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "department_id")
private Department department;

@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "employment_type_id")
private EmploymentType employmentType;

@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "citizenship_id")
private Citizenship citizenship;

public Employee() {
}
}

但这是我将收到的 HTTP POST 请求。

id: 1
firstName: Bob
lastName: Dole
middleName: Trump
loginId: bdole
departmentId: 1
employmentTypeId: 2
citizenship_id: 4

JPA 想要保存关系对象,而不是 ID。然而,做所有这些查找也似乎效率低下,将 ID 转换为持久化所需的对象。有没有更好的方法来处理这个问题?

【问题讨论】:

  • 您是否想过将外键映射为基本映射,而不是使其成为参考映射?如果您的应用程序不需要获取和传递完整的部门、就业类型和公民身份,为什么要在对象模型中为您的应用程序增加负担呢?尽管您可能需要执行查找以确保这些 ID 存在,否则您的帖子可能会为您提供不存在的部门编号,因此您可能仍需要进行查找。

标签: hibernate jpa


【解决方案1】:

使用 getReference http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#getReference%28java.lang.Class,%20java.lang.Object%29

它调用 entityManager 使用 id 加载客户对象,然后将其设置到客户历史记录中。在大多数情况下,此调用将返回一个仅嵌入了 id 的代理。

Department department = entityManager.getReference(Department.class, departmentId);

Employee employee = new Employee();
employee.setDepartment(department);

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2015-08-08
    • 2012-09-27
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多