当前位置: 首页 > 知识库问答 >
问题:

在jpa CRUD存储库中保存和更新

欧阳意蕴
2023-03-14

我有一个数据已经保存在我的数据库基于我的存储库和服务。我想保存另一个数据与邮递员只改变播放器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);
    }

}

共有2个答案

子车灿
2023-03-14

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

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

在postman中,您应该将数据库表主键id与playerID一起传递。然后调用merge(实体)。它将根据主键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
商冠玉
2023-03-14

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

 类似资料:
  • 无论如何,如果用户名已经被使用,存储库只需进行更新,因为指定的标识符不是空的。这不是我想要的行为,我需要它抛出类似重复条目异常的东西。有什么办法可以预防吗?我必须自己做吗?例如:

  • 我有以下课程: DBEntity.java 使用者JAVA 用户服务。JAVA UserRepository.java

  • 问题内容: 假设您已经在使用m2eclipse插件,当它没有将依赖关系更新到您的仓库中的最新版本时,您该怎么办? 例如,在命令行上,您只需添加如下标记即可 …强制更新依赖项。Eclipse中是否有类似的东西?(似乎并不总是能够获得最新更新。) 问题答案: 您可以 右键单击 项目,然后 右键单击 Maven >更新项目…,然后选择 强制更新快照/发布 复选框,然后单击确定。

  • 由于“需要HTTPS”错误,我最近在构建项目时遇到了问题。这个问题通过如下所述修改我的pom.xml得到了解决,添加了以下内容: 然而,为我的每个项目更新每个pom.xml是一件麻烦的事。 我尝试将相同的代码片段添加到我的settings.xml,但没有成功。 我知道更新版本的Maven解决了这个问题。然而,由于工作限制,我无法更新我的环境。 我目前已经安装了Java8和Maven,由Netbea

  • 这很可能通过Nexus配置得到解决。 我们使用maven进行hadoop开发。Nexus被配置为所有存储库的镜像,存储库被添加到Nexus公共组中。(参见Nexus中有没有更好的配置存储库的方法?) 我发现hadoop-core工件版本1.0.4显示来自spring-roo-repositoryhttp://spring-roo-repository.springsource.org/releas