エンティティIDが生成され、SpringデータJPAの代わりにDAOを使用すると正常に機能しました。
_@Id
@Column(name = TABLE_COLUM_NAME_ID)
@GeneratedValue
private int id;
_
SpringデータJPAの使用を開始し、repository.save(myboject)
またはrepository.saveAndFlush(myobject)
を呼び出した後、myobject.getId()
を呼び出します。ただし、idには値が設定されません。
データベースを検索しましたが、オブジェクトはデータベース内にあり、IDは正しいです。 save()
を呼び出した後にidが設定されない理由を知っていますか? entitymanager.save()
を使用しても問題はありません。
これを試してみて
_myboject = repository.save(myboject);
repository.flush();
_
getId()
;を呼び出した後
この投稿があなたの質問に答えると思います:
Spring Data JPAリポジトリでsave()の後に返されたインスタンスを使用する理由
repository.save()
メソッドは実際にJPA entityManager.merge()
のような新しいオブジェクトを返し、返されたオブジェクトはIDが設定されるオブジェクトです。
repository.saveAndFlush();
メソッドを使用する必要があります。
MyObject savedObject= repository.saveAndFlush(newObject);
@GeneratedValue(strategy = GenerationType.AUTO)
)を関連フィールド(id
)に追加する必要があります。@Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.AUTO) public long getId() { return id; }
@GeneratedValue
のような戦略を指定してみてください
@GeneratedValue(strategy = GenerationType.AUTO)
このメソッドは、保存されたid
を返します
myobject = repository.saveAndFlush(myobject);
これでid
ができました。
私はついにそれを理解しました。 saveメソッドは無効ですが、変数を設定できます。(?)
@PostMapping(value = "customer/{id}/wish/add")
public String processAddWish(Model model, @PathVariable int id,
@ModelAttribute @Valid WishOrder newWishOrder,
Errors errors) {
if (errors.hasErrors()) {
return "customer/wish/add";
}
//Initialize variable to the save method, even though it is void and returns nothing//
//Eliminates need to access object through a .findById//
//If you need the id of the saved object instantly, just add .getId to save call//
//wishOrderDao.save(newWishOrder).getId()//
WishOrder wish = wishOrderDao.save(newWishOrder);
Customer customer = customerDao.findById(id);
customer.getWishList().add(wish);
customerDao.save(customer);
model.addAttribute("customer",(customer));
model.addAttribute("wishList", (customer.getWishList()));
return "customer/wishList";
}