1. ホーム
  2. hibernate

[解決済み] Spring MVC + Hibernate: ロードするためのidが必要

2022-02-24 12:51:36

質問

このような初歩的な質問で申し訳ないのですが、よろしくお願いします。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";
    }
}

何が足りないのでしょうか?何かお手伝いいただけると助かります。

解決方法は?

問題はHibernateにあるのではありません。 title.getTitleId() に渡すと、NULLになります。 session.get() それは、あなたのウェブサービスやアプリケーションの問題です。

  1. あなたのGETはモデルオブジェクトのidを提供していないかもしれません。
  2. クライアントコード(フォーム、クライアントアプリ、ajax コールなど)が、GET と POST の間で ID を保持しない可能性があります。
  3. POST でモデルオブジェクトに ID が提供されていない可能性があります。

Web、Rest、WSセッションにまたがる属性の保持に問題がある場合は、ここで詳細を説明するか、新しい質問をすることができます。