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无法正常工作?

Spring-Boot,无法使用 spring-data JPA 在 MySql 中保存 unicode 字符串

保存对象时未填充 Spring Boot JPA@CreatedDate @LastModifiedDate