web-dev-qa-db-ja.com

Spring Data JPA .save()メソッドがデータベースに保存されない

私はモデルを持っています:

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;
    }
}

私はコントローラークラスを持っています:

@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);

    }

}

私のリポジトリクラス:

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

    List<ABC> findByAId(Integer aId);

    ABC findByBaseId(Integer baseId);
}

データベーステーブルにエントリがあります:

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

エンドポイントを呼び出すと、エラーは発生せず、次が返されます。

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

しかし、データベースにクエリを実行しても、レコードはそこで更新されません。私は自分が間違っていることを理解していません。残りの呼び出しを行おうとしたときにIDを提供していますが、そのIDはデータベースに存在します。

3
nisha kanani

saveを使用すると、変更はすぐにDBにフラッシュされる必要はなく、フラッシュまたはコミットコマンドが発行されるまで、メモリ内にとどまることがあります。

saveAndFlushを使用すると、変更はすぐにDBにフラッシュされます。

ただし、トランザクションの変更をフラッシュしてコミットしない場合、このトランザクションでコミットするまで、変更は外部のトランザクションに表示されません。

BaseControllerで変更してみてください

return baseRepository.save(abc);

return baseRepository.saveAndFlush(abc);

詳細情報 ここ および ここ

3
Dazak

同じ理由で誰かがここにいて答えが見つからなかった場合:

次のセットがあるか確認しましたか?おそらくスキーマ全体が再作成されているのでしょうか?

spring.jpa.hibernate.ddl-auto = create

0
SydMK