Hibernate在持久化时使用id填充实体

时间:2015-12-26 14:28:52

标签: java hibernate hql

当hibernate持久存在一个实体时,它会自动用生成的ID替换空ID。这工作正常,但是当我持久存在于数据库中的对象{其中一列标记为唯一}时,它不会返回正确的ID,而是返回新创建的ID。有没有办法获得正确的ID?

以下是我要做的事情{使用正确的ID 加载标记,尝试使用正确的ID加载所有持久标记}:

// Create all tags
List<Tag> createdTags = createTags();

// Save all new tags, ignore tags that are already in the database
int error = tagService.saveTags(createdTags);

// load tags with correct ids
createdTags = tagService.getTagsByName(createdTags);

for (Tag t : createdTags) {
    logger.debug("ID: " + t.getId() + "TAGNAME: " + t.getTagName());
}

Post post;

if (visibilityComboBox.getValue().equals(visibility.getPublicValue())) {
   post = new Post(securityHelper.getLogedInUser(), message.getValue());
} else {
   post = new Post(securityHelper.getLogedInUser(), message.getValue(), Visibility.FRIENDS);
}

// Save post
postService.persist(post);

// Save posts tags
if (createdTags == null || createdTags.size() > 0) {
    PostTags postTags = new PostTags(createdTags, post);
    postTagsService.persist(postTags);
}

我认为没有,我试图从数据库中加载它。但这导致了我的第二个问题。鉴于这个HQL:

String query = "FROM " + this.genericType.getName()
               + " AS tags WHERE tags.tagName in (:tagName)";

List<Tag> ta = (List<Tag>) session.createQuery(query).setParameterList("tagName", namesArray).list();

namesArray是一个字符串数组,tags.tagName是一个字符串。

它始终只返回数组中的最后一个标记。为什么不起作用?

感谢您的回答。

Link to repository

1 个答案:

答案 0 :(得分:0)

如果您的代码已经设置了代码的ID,那么您可以使用合并。假设他们没有,那么你将不得不做你已经尝试做的事情。

您的查询没有任何问题。我刚刚在我的数据模型中尝试了一些非常相似的东西并获得了预期的结果namesArray是一个长度为1的数组,或者只有一个匹配的标记。这是我跑的查询:

HibernateQuery query = (HibernateQuery) em.createQuery("FROM Study AS s WHERE s.studyNumber in (:nums)");
query.getHibernateQuery().setParameterList("nums", new Integer[] {2, 3, 4});
List<?> result = query.getResultList();
System.out.println(result.size()); //printed 3

如果你想获得幻想,你可以将这两个操作合并为一个&#34;查询&#34;如果你使用本机SQL或那种性质的东西,但除非这是一个性能瓶颈,我首先要坚持使用更简单的方法。

此外,假设标记列表相对较小,您还可以将它们缓存在内存中,以避免在第一次查找时出现数据库错误。

另请参阅:Save object in database if it does not already exist (Hibernate & Spring)