我想问一下如何实现像@ManyToOne关系更新实体这样的事情。我有两个表Documents和DocType类型
Doucments
@JoinColumn(name = "doctype", referencedColumnName = "document_id")
@ManyToOne
private DocType doctype;
DocType
@OneToMany(mappedBy = "doctype")
private Collection<Documents> DocCollection;
当用户需要更新doctype时,他在组合框中键入值,其中包含字符串中的所有文档类型名称。然后我找到doctype实体,其中doctype name就像在combobox中选择的值,然后我将doctype实体设置为文档实体。
public void saveDoc() {
entityManager.getTransaction().begin();
currentEntitydoc.setDocType(getDocTypeEntity(ComboBox.getSelectedValue()));
entityManager.getTransaction().commit();
}
其中getDocTypeEntity()类似于
public DocType getDocTypeEntity ( String userInput) {
query = manager.createQuery(
"Select type from DocType type Where type.name=:arg1"
);
query.setParameter("arg1" , userInput);
List<DocType> list = query.getResultList();
if (list.size() < 1 ) {
System.out.println ("can't find such DocType name);
}
return list.get(0);
}
似乎这是一项非常常见的任务,你如何实施这些事情?在JPA中有更好的方法吗?
答案 0 :(得分:0)
实体具有唯一标识它们的ID。并且EntityManager允许获取给定其类型和ID的实体。所以你需要的只是
DocType docType = em.find(DocType.class, docTypeId);
甚至
DocType docType = em.getReference(DocType.class, docTypeId);
甚至不需要发出选择查询(并返回一个统一代理)。
您不应将Doctype的名称用作选择选项值,而应使用其ID。