web-dev-qa-db-fra.com

La méthode Spring Data JPA .save () n'est pas enregistrée dans la base de données

J'ai un modèle:

public class ABC implements Serializable {
    private int baseId;
    private Integer aId;
    private Integer bId;
    private Boolean isReal;
    private TimeStamp updateTime;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "base_id", nullable = false)
    public int getBaseId() {
        return baseId;
    }
    public void setBaseId(int baseId) {
        this.baseId = baseId;
    }

    @Basic
    @Column(name = "a_id", nullable = false)
    public Integer getAId() {
        return aId;
    }

    public void setAId(Integer aId) {
        this.aId = aId;
    }

    @Basic
    @Column(name = "b_id", nullable = false)
    public Integer getBId() {
        return bId;
    }

    public void setBId(Integer bId) {
        this.bId = bId;
    }
    @Basic
    @Column(name = "is_real")
    public Boolean getIsReal() {
        return isReal;
    }

    public void setIsReal(Boolean isReal) {
        this.isReal = isReal;
    }

    @Basic
    @Column(name ="update_time")
    public Timestamp getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }
}

J'ai une classe de contrôleur:

@RestController
@RequestMapping(path = "${serverconfig.api-base-path}/base")
public class BaseController {
    /**
     * Instance of an logger
     */
    private static final Logger LOG = 
        LoggerFactory.getLogger(BaseController.class);

    /**
     * Base repository
     */
    private BaseRepository baseRepository;

    /***
     *
     * @param baseRepository
     */
    public BaseController(BaseRepository baseRepository) {
        LOG.trace("BaseRepository constructor method.");
        this.baseRepository = baseRepository;
    }

    @PostMapping(path = Route.UPDATE_IS_REAL)
     // @Transactional
    public ABC updateIsReal(@Valid @RequestBody 
    @RequestParam("baseId") int baseId,

    @RequestParam("isReal") boolean isReal){
        ABC abc = baseRepository.findByBaseId(baseId);
        Date date= new Date();
        Timestamp ts = new Timestamp(date.getTime());
        abc.setBaseId(baseId);
        abc.setIsReal(isReal);
        abc.setUpdateTime(ts);

        return baseRepository.save(abc);

    }

}

Ma classe de référentiel:

 @Repository
 public interface BaseRepository extends 
 JpaRepository<ABC, Integer> {

    List<ABC> findByAId(Integer aId);

    ABC findByBaseId(Integer baseId);
}

La table de base de données a une entrée:

"base_id": 1,
"a_Id": 1,
"b_Id": 1,
"is_real": null,
"update_time": null

Lorsque j'appelle le point de terminaison, il ne donne aucune erreur et renvoie:

"base_id": 1,
"aId": 1,
"bId": 1,
"isReal": yes,
"updateTime": 018-10-01T18:30:56.765+0000

Mais lorsque j'interroge la base de données, l'enregistrement n'y est pas mis à jour. Je ne comprends pas ce que je fais mal. Je fournis l'identifiant lorsque j'essaie de faire un appel de repos et cet identifiant existe dans la base de données.

3
nisha kanani

Avec save, les modifications ne seront pas nécessaires immédiatement transférées dans la base de données et peuvent rester uniquement en mémoire, jusqu'à ce que les commandes flush ou commit soient émises.

Avec saveAndFlush, les modifications seront immédiatement vidées dans DB.

Cependant, si vous videz les modifications dans la transaction et ne les validez pas, les modifications ne seront toujours pas visibles pour les transactions externes jusqu'à ce que la validation dans cette transaction.

Dans votre BaseController, essayez de changer

return baseRepository.save(abc);

à

return baseRepository.saveAndFlush(abc);

Plus d'informations ici et ici

3
Dazak

Si quelqu'un était là pour la même raison et n'a pas trouvé de réponse ..:

Avez-vous vérifié si vous disposez de l'ensemble suivant? Peut-être que le schéma entier peut être recréé?

spring.jpa.hibernate.ddl-auto = créer

0
SydMK