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

Hibernate filling entities with ids while persisting

当 hibernate 持久化实体时,它会自动用生成的 ID 替换空 ID。这很好用,但是当我保留一个已经存在于数据库中的对象时{其中一列被标记为唯一},它没有 return 正确的 ID,而是 return 新创建的 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是一个字符串。

它总是 return 数组中的最后一个标签。为什么它不起作用?

感谢您的回答。

Link to repository

如果您的标签已经设置了标签的 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

如果你想要花哨的,你可以将这两个操作组合成一个 "query" 如果你使用原生 SQL 或类似的东西,但除非这是性能瓶颈我首先坚持使用更简单的方法。

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

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