相关疑难解决方法(0)

如何使用spring-data-jpa更新实体?

好吧,这个问题几乎说明了一切.使用JPARepository如何更新实体?

JPARepository只有一个save方法,它不会告诉我它是否实际创建或更新.例如,我将一个简单的Object插入数据库User,它有三个字段:firstname和lastname以及age:

 @Entity
 public class User {

  private String firstname;
  private String lastname;
  //Setters and getters for age omitted, but they are the same as with firstname and lastname.
  private int age;

  @Column
  public String getFirstname() {
    return firstname;
  }
  public void setFirstname(String firstname) {
    this.firstname = firstname;
  }

  @Column
  public String getLastname() {
    return lastname;
  }
  public void setLastname(String lastname) {
    this.lastname = lastname;
  }

  private long userId;

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  public long getUserId(){
    return this.userId;
  }

  public …
Run Code Online (Sandbox Code Playgroud)

java jpa spring-data-jpa

171
推荐指数
8
解决办法
31万
查看次数

Spring数据:CrudRepository的保存方法和更新

我想知道如果它在数据库中找到已经存在的条目,那么该{save}方法CrudRepository是否进行更新:

@Repository
public interface ProjectDAO extends CrudRepository<Project, Integer> {}

@Service
public class ProjectServiceImpl {

@Autowired private ProjectDAO pDAO;

public void save(Project p) { pDAO.save(p); } }
Run Code Online (Sandbox Code Playgroud)

因此,如果我在已注册的条目上调用该方法,它会在找到更改的属性时更新它吗?

谢谢.

database hibernate spring-mvc spring-data spring-data-jpa

24
推荐指数
3
解决办法
6万
查看次数

HQL更新是否清除了二级缓存?

本机查询正在清除第二级缓存条目.来自7年前的hibernate论坛的回答说,HQL更新查询也清除了二级缓存.但这仍然是真的吗?

由于HQL查询具有要更新的确切字段,并且在哪个实体中,我认为不应该像session.save(..)调用常规一样难以表现.

java hibernate

16
推荐指数
2
解决办法
2702
查看次数

如何使用 JPA 存储库更新实体中的一个字段

我的实体有 3 个字段:id、姓氏和电话号码。我想创建适用于更新所有字段或仅更新一两个字段的方法。

我使用 Hibernate 和 JPA 存储库。当我尝试更新所有字段时,一切正常,但例如,当我只想更新姓氏而不更改电话号码时,我在输出中插入了旧电话号码的 null 。

这是我在控制器中的方法:

@PutMapping("/students/update/{id}")
public String updateStudentById(@ModelAttribute Student student, @ModelAttribute StudentDetails studentDetails,
                                String lastname, String phoneNumber,
                                @PathVariable Long id) {

    Optional<Student> resultOptional = studentRepository.findById(id); 

    //Student result =resultOptional.get();
    resultOptional.ifPresent((Student result) -> {
           result.getStudentDetails().setPhoneNumber(studentDetails.getPhoneNumber());     result.getStudentDetails().setLastname(studentDetails.getLastname());
        studentRepository.save(result);
    });
    return "Student updated";
}
Run Code Online (Sandbox Code Playgroud)

更新的类:

@DynamicUpdate
@Entity
public class StudentDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name="lastname")
    private String lastname;
    @Column(name="phone_number")
    private String phoneNumber;

    public StudentDetails() {
    }

    public StudentDetails(Long id, String lastname, String phoneNumber) …
Run Code Online (Sandbox Code Playgroud)

java spring spring-data-jpa

5
推荐指数
1
解决办法
1万
查看次数

JpaRepository getOne() 获取并更新整个对象

我试图模仿这个已接受的答案 /sf/answers/2782285201/在仅更新某些对象的字段时使用 Hibernate 代理。我的代码如下所示:

  @Transactional
public void updateStudentYear(int uniqueNumber, int newYear) {
    Student studentProxy = studentRepository.getOne(uniqueNumber);
    studentProxy.setYear(newYear);
    studentRepository.save(studentProxy);
}
Run Code Online (Sandbox Code Playgroud)

问题在于 Hibernate 既执行完全选择又执行完全更新。这是日志:

2021-03-10 20:24:23.240 DEBUG 118757 --- [ main] org.hibernate.SQL :从学生中选择student0_.unique_number作为unique_n1_1_0_,student0_.name作为name2_1_0_,student0_.team作为team3_1_0_,student0_.year作为year4_1_0_ Student0_ 其中student0_.unique_number=?

2021-03-10 20:24:23.268 DEBUG 118757 --- [ main] org.hibernate.SQL : 更新学生集 name=?, team=?,year=? 其中 unique_number=?

我原以为只会发出一个“更新年份”语句,但令我惊讶的是,看起来一切都是像经典的 findOne()/save() 对操作一样完成的。我错了吗?

java proxy spring hibernate spring-data-jpa

5
推荐指数
1
解决办法
372
查看次数