web-dev-qa-db-fra.com

Les données de printemps jpa save ne peuvent pas être identifiées

Mon identifiant d'entité est généré et cela fonctionnait bien lorsque j'utilise DAO au lieu de Spring JPA.

@Id
@Column(name = TABLE_COLUM_NAME_ID)
@GeneratedValue
private int id;

Maintenant, je commence à utiliser les données Spring JPA, et après avoir appelé repository.save(myboject) ou repository.saveAndFlush(myobject), j'appelle myobject.getId(). Mais l'identifiant n'est jamais rempli.

J'ai recherché ma base de données et l'objet est dans la base de données et l'ID est correct. Est-ce que quelqu'un sait pourquoi l'ID n'est pas défini après avoir appelé save()? Je n'ai aucun problème lorsque j'utilise entitymanager.save().

23
Grey

Essayez ça comme

myboject = repository.save(myboject);
repository.flush();

Puis après appel à getId();

11
NPKR

Je crois que ce message répond à votre question:

Pourquoi utiliser l'instance retournée après save () sur Spring Data JPA Repository?

La méthode repository.save() renvoie en fait un nouvel objet comme JPA entityManager.merge() et l'objet retourné est celui qui aura l'ID défini.

15
wrschneider
  1. Vous devez utiliser la méthode repository.saveAndFlush();:

MyObject savedObject= repository.saveAndFlush(newObject);

  1. Dans la description de l'objet Entity, vous devez ajouter l'attribut suivant (@GeneratedValue(strategy = GenerationType.AUTO)) au champ associé (id):
@Id   
@Column(name = "id")   
@GeneratedValue(strategy = GenerationType.AUTO)   
public long getId() {  
    return id;  
}
7
Celik

Essayez de spécifier une stratégie pour @GeneratedValue comme

@GeneratedValue(strategy = GenerationType.AUTO)
6
TheKojuEffect

Cette méthode renvoie le id enregistré

myobject = repository.saveAndFlush(myobject);

Vous avez maintenant votre id.

3
bpedroso

Je l'ai finalement compris. Même si la méthode de sauvegarde est nulle, vous pouvez lui attribuer une variable. (?)

    @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";
}
0
Maestro