【问题标题】:Hibernate filling entities with ids while persistingHibernate 在持久化的同时用 id 填充实体
【发布时间】:2015-12-26 14:28:51
【问题描述】:

当 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

【问题讨论】:

  • 不要发布代码链接。贴出代码。

标签: java hibernate hql


【解决方案1】:

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

如果你想变得花哨,如果你使用原生 SQL 或类似性质的东西,你可以将这两个操作组合成一个“查询”,但除非这是性能瓶颈,否则我会先坚持使用更简单的方法.

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

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

【讨论】:

  • 感谢您的链接,它帮助我改变了解决问题的方法。现在我加载数据库中已有的标签,然后保存我没有的标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2020-02-21
相关资源
最近更新 更多