Spring数据jpa保存无法获取id
Posted
技术标签:
【中文标题】Spring数据jpa保存无法获取id【英文标题】:Spring data jpa save can not get id 【发布时间】:2017-10-28 18:13:06 【问题描述】:我的实体 id 已生成,当我使用 DAO 而不是 Spring data JPA 时它工作正常。
@Id
@Column(name = TABLE_COLUM_NAME_ID)
@GeneratedValue
private int id;
现在我已经开始使用 Spring data JPA,在我调用repository.save(myboject)
或repository.saveAndFlush(myobject)
之后,我调用myobject.getId()
。但 id 永远不会被填充。
我搜索了我的数据库,对象在数据库中,并且 id 是正确的。
有谁知道我打电话给save()
后为什么没有设置id?我使用entitymanager.save()
时没有问题。
【问题讨论】:
【参考方案1】:试试这个
myboject = repository.save(myboject);
repository.flush();
然后打电话给getId()
;
【讨论】:
问题是MyEntity requestEntity; savedEntity = repositroy.save(requestEntity)。 Id 不在 requestEntity 中,而是在 savedEntity 中 @NPKR 请不要像尝试这样给出答案...在需要时添加适当的解释来回答。 不需要这个,你只需要在实体中添加以下注释:@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private long id; 【参考方案2】:尝试为@GeneratedValue
指定策略喜欢
@GeneratedValue(strategy = GenerationType.AUTO)
【讨论】:
AUTO 是默认值:docs.oracle.com/javaee/5/api/javax/persistence/…【参考方案3】:我相信这篇文章回答了你的问题:
Why to use returned instance after save() on Spring Data JPA Repository?
repository.save()
方法实际上返回了一个新对象,例如 JPA entityManager.merge()
,返回的对象就是设置了 ID 的对象。
【讨论】:
【参考方案4】:该方法返回保存的id
myobject = repository.saveAndFlush(myobject);
现在你有你的id
。
【讨论】:
【参考方案5】:-
你应该使用
repository.saveAndFlush();
方法:
MyObject savedObject= repository.saveAndFlush(newObject);
-
在 Entity 对象描述中,您应该在相关字段(
id
)中添加以下属性(@GeneratedValue(strategy = GenerationType.AUTO)
):
@Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.AUTO) public long getId() return id;
【讨论】:
这对我有用,谢谢,缺少 generateValue 注释【参考方案6】:我终于明白了。即使保存方法是无效的,你也可以给它设置一个变量。(?)
@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";
【讨论】:
【参考方案7】:我猜你的 Service 方法上没有 @Transactional 注释。
【讨论】:
以上是关于Spring数据jpa保存无法获取id的主要内容,如果未能解决你的问题,请参考以下文章
具有多个数据源的春季批处理junit。 spring data jpa无法将数据保存在内存数据库中
Spring Data Jpa Repository 未将实体保存到数据库
保存后刷新并获取实体(JPA/Spring Data/Hibernate)
为什么Spring-Data-JPA Async无法正常工作?