当前位置: 首页 > 面试题库 >

spring JPA CRUD存储库并更新记录

陈实
2023-03-14
问题内容

这是一个关于带有Hibernate和PostgreSQL的Spring Boot MVC应用程序的问题。

我有一个网页,允许用户为应用程序设置管理/配置数据,我想将此数据存储在单个数据库记录中。我有一个POJO来包含数据。我已经编写了一个持久化此数据的Spring
MVC应用程序。

问题在于,每次用户保存数据(通过从网页执行POST)时,Spring应用程序都会在数据库中创建一条新记录。

我使用的是Repository,给人的印象是,每次对对象执行Repository.save()时,都会更新现有记录(如果有的话),否则将创建一个新记录并标识该记录基于主键。我找不到“更新”方法。

我已经尝试过几种解决此问题的方法,但是它们要么仍然做额外的记录,要么由于重复的键错误而失败,要么只是不起作用。

另外,似乎每次我启动网页或应用程序时,数据库中的所有数据都会被删除。

那么诀窍是什么?非常感谢…

这是我的代码:

AdminFormController.java

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.beans.factory.annotation.Autowired;


@Controller
public class Admin_FormController 
{

    @Autowired
    private AdminDataRepository rep;

    @RequestMapping(value="/admin", method=RequestMethod.GET)
    public String adminForm(Model model) 
    {
        AdminData ad = new AdminData();
        model.addAttribute("adminForm", ad);

        ad = rep.findById(1L);

        if(ad != null)
            ad.setId(1L);

        return "adminForm";
    }

    @RequestMapping(value="/admin", method=RequestMethod.POST)
    public String adminSubmit(@ModelAttribute AdminData ad, Model model) 
    {

        // ad.setId(1L);;

        rep.save(ad);

        model.addAttribute("adminForm", ad);

        return "adminForm";
    }
}

AdminDataRepository.java

import org.springframework.data.repository.CrudRepository;

public interface AdminDataRepository extends CrudRepository<AdminData, String> 
{
    AdminData findById(Long Id);
}

AdminData.java

import java.util.logging.Logger;
import javax.persistence.*;

@Entity
public class AdminData 
{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)   
    private Long id;

    private String useDates;

    private String startDate;
    private String endDate;

    public String getUseDates()
    {
        return useDates;
    }


    public String getStartDate() 
    {
        return startDate;
    }

    public String getEndDate() 
    {
        return endDate;
    }

    public void setUseDates(String s)
    {
        Logger.getGlobal().info(() -> "UseDates: " + s);
        useDates = s;
    }

    public void setStartDate(String s) 
    {
        Logger.getGlobal().info(() -> "Start Date: " + s);
        startDate = s;
    }

    public void setEndDate(String s) 
    {
        Logger.getGlobal().info(() -> "End Date: " + s);
        endDate = s;
    }

}

问题答案:

您需要将对象存储在请求之间的某个位置。您的选择:

  1. 使用隐藏的表单域
  2. 从数据库中重新读取它(在您的POST方法中)
  3. 使用会话

1不方便,也不安全。2不支持并发控制。3是安全正确的。

要实施#3,请@SessionAttributes("yourAttributeName")在之前添加controllerSessionStatus在您的POST方法中添加参数,并sessionStatus.setComplete()在完成后调用。



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

  • 我有一个数据已经保存在我的数据库基于我的存储库和服务。我想保存另一个数据与邮递员只改变播放器id。但它不是创建一个新的实体数据。它更新现有的实体数据。我的问题是如何更新一个数据由我的服务当它找到一个现有的id。但当它找到一个新的id将保存一个新的数据到数据库。 这是我的回购: 这是我的服务:

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

  • 问题内容: 我正在尝试创建一个存储的proc,它返回所有已更新的记录。 我的更新查询是这样的: 我只是不确定如何返回这些特定记录。 问题答案: 您可以用来获取语句已修改的行。 例子;

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

  • 我正在尝试更新数据,据我所知,save()方法在id为空时保存实体,或者在DB中找到给定id时更新数据库中现有的实体。 但是,当我尝试保存数据时,它不会被更新: 但是,当我从数据库检索数据并更新其字段并再次保存时,它会更新: 和实体:

  • 假设我们有一个带有自定义方法的Spring数据存储库接口... 此方法只是设置实体的 deletedAt 字段,ok。有没有办法允许此方法返回 的更新版本? 明显地 …不起作用,因为… java.lang.IllegalArgumentException:修改查询只能使用void或int/Integer作为返回类型! 安宁是否知道另一种轻松允许这种情况的方法,当然除了明显的“在存储库和调用者之间添

  • 我不明白为什么不更新我的对象。在另一个组件中,我通过调度更新状态。在此情况下(在下面的代码中),mapStateToProps类别中的代码正在更改(控制台日志显示另一个类别)。但组件并没有重播,虽然在组件中我使用了道具。类别。事件控制台。登录元素未运行 我认为,如果我更新状态,则根据该状态更新组件。它应该如何工作?它应该如何工作?它可能很有用,添加类别的项不是父项或子项,而是邻居 谢谢你解决问题。