【问题标题】:Save and Update in jpa CRUD repository在 jpa CRUD 存储库中保存和更新
【发布时间】:2018-11-04 06:17:26
【问题描述】:

我已经根据我的存储库和服务将一个数据保存在我的数据库中。我想通过仅更改播放器 ID 来使用邮递员保存另一个数据。但它不会创建新的实体数据。它会更新现有的实体数据.我的问题是如何在我的服务找到现有ID时更新数据。但是当它找到新ID时,它将新数据保存到数据库中。

这是我的仓库:

@Repository
@Transactional
public interface CricketPlayerRepository extends CrudRepository<CricketPlayer,String>  {
    Optional<CricketPlayer> findCricketPlayerByName(String name);


}

这是我的服务:

@Service
public class CricketPlayerService {

    private CricketPlayerRepository cricketPlayerRepository;


    public CricketPlayerService(CricketPlayerRepository cricketPlayerRepository) {
        super();
        this.cricketPlayerRepository = cricketPlayerRepository;
    }

    public CricketPlayerService() {
    }

    public Optional<CricketPlayer> getPlayerByName(String name){
        return cricketPlayerRepository.findCricketPlayerByName(name);
    }

    public CricketPlayer save(CricketPlayer cricketPlayer){
        Optional<CricketPlayer> id = cricketPlayerRepository.findById(cricketPlayer.getPlayerId());
        if (id.isPresent()){
            //code here
        }
//        if (entityManager.isNew(cricketPlayer)) {
//            em.persist(cricketPlayer);
//            return cricketPlayer;
//        } else {
//            return em.merge(cricketPlayer);
//        }
        return cricketPlayerRepository.save(cricketPlayer);
    }

    public Iterable<CricketPlayer> findAllPlayers() {
        return cricketPlayerRepository.findAll();
    }

    public Optional<CricketPlayer> findPlayersById(String id) {
        return cricketPlayerRepository.findById(id);
    }

}

【问题讨论】:

  • 那是一些文字的图片...?如果您认为这会有所帮助,也许您可​​以发布文本。

标签: java hibernate spring-boot spring-data-jpa crud


【解决方案1】:

hibernate(和其他框架)中的保存和更新操作基于 id 值。如果存在 id 则合并(更新)实体,否则保存新实例。所以在这种情况下是做不到的。

【讨论】:

  • 那是什么逻辑呢?
  • @NirobRasseen 一些笔记。 1.如果您的数据存在于数据库中,首先获取它并将其值分配给其他实体。 2.如果数据库中不存在您的数据,则创建新实体保存,然后将其值分配给其他实体。 3. 不要试图改变表中某行的 id 列,因为 id 列用于区分常规表中的不同行。最后,如果你坚持要改变它的值,你可以使用 JDBC pure 但这是不合理的。谢谢。
【解决方案2】:

1)如果 PlayerId 是主键 id,那么你会调用 merge(entity)。如果 PlayerId 存在,它将更新,否则它将创建新记录。

2) 如果PlayrerId 不是主键id。最佳做法是避免将 PlayerId 作为主键。

在邮递员中,您应该将数据库表的主键 ID 与 PlayerId 一起传递。 然后你调用合并(实体)。它将根据主键处理创建或更新 id 是否为空。

例如,如果您在请求中传递了主键 ID。

    Entity e = new Entity();
    if (entityFromRequest.getId() != null){ //this is the db id from request
        //get the entity from db and then change the state   
        e = entity from db by using id
    }
    e.setPlayerId = entityFromRequest.getPlayerId
    merge(e);  // it will create or update record

【讨论】:

猜你喜欢
  • 2015-10-04
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2022-12-23
  • 1970-01-01
  • 2021-05-14
相关资源
最近更新 更多