【问题标题】:Spring MVC + Hibernate: id to load is required for loadingSpring MVC + Hibernate:加载需要加载id
【发布时间】:2014-02-25 16:07:47
【问题描述】:

这是一个菜鸟问题,我知道,我很抱歉。我正在尝试使用 Hibernates session.merge() 方法编辑现有记录,但出现以下错误:

java.lang.IllegalArgumentException: id to load is required for loading

这是我的对象:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "TITLE_ID", unique = true, nullable = false)
private Integer titleId;

@NotNull
@NotBlank
@Column(name = "TITLE_DESCRIPTION", nullable = false, length = 10)
private String titleDescription;
// default constructor, getters & setters

这是服务层方法:

 public void edit(Title title) {
     logger.debug("Editing existing title");

     // Retrieve session from Hibernate
     Session session = sessionFactory.getCurrentSession();

     // Retrieve existing title via id
     Title existingTitle = (Title) session.get(Title.class, title.getTitleId());

     // Assign updated values to this title
     existingTitle.setTitleDescription(title.getTitleDescription());

     // Save updates
     session.merge(existingTitle);
 }

这是控制器的 POST 方法:

@RequestMapping(value="/edit", method = RequestMethod.POST)
public String postEditTitle(@Valid @ModelAttribute("titleAttribute") Title title,
                        BindingResult result) {

    logger.debug("Received request to edit title");

    if (result.hasErrors()) {
        return "editTitle";
    }
    else {
        titleService.edit(title);
        return "redirect:/essays/main/title";
    }
}

我错过了什么?任何帮助将不胜感激。

【问题讨论】:

  • 你是对的@PaulHicks,title.getTitleId() 为空!但我不知道为什么...
  • 将我的评论升级为答案
  • 在这个网站上,您必须先道歉才能提出问题,这是一种耻辱。

标签: hibernate spring-mvc


【解决方案1】:

问题不在于 Hibernate。当您将title.getTitleId() 传递给session.get() 时,title.getTitleId() 为空,这是您的 Web 服务/应用程序的问题。

  1. 您的 GET 可能未在模型对象中提供 id
  2. 您的客户端代码(表单、客户端应用程序、ajax 调用等)可能不会保留 GET 和 POST 之间的 ID
  3. 您的 POST 可能未在模型对象中提供 id。

如果您在网络、休息或 WS 会话中保留属性时遇到困难,可以在此处提供更多详细信息,或提出新问题。

【讨论】:

  • 我刚刚在我的视图中添加了 titleId 的隐藏输入,现在它正在工作,所以我猜第二个适用。有没有更优雅的方法可以做到这一点,而不添加隐藏字段? @PaulHicks
  • 我对这个领域不是特别熟悉,但这是我在旧应用程序中看到的解决方案。我想这曾经是做事的标准方式。对于较新的框架(我正在考虑 AngularJS,但我知道其他人也这样做),这通常不是必需的。
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2011-09-24
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多