【问题标题】:Spring data JPA save updating parent entitySpring数据JPA保存更新父实体
【发布时间】:2018-07-09 13:03:55
【问题描述】:

学生.java

@Entity
@Table(name = "Student")
@Data
@NoArgsConstructor
public class Student implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @OneToMany(mappedBy = "studentId", cascade = CascadeType.ALL)
   private List<Subject> subjectList = new ArrayList<>();

   public void addSubject(Subject subject) {
     subjectList.add(subject);
     subject.setStudentId(this);
   }

   @Column(name = "firstName")
   private String firstName;

   @Column(name = "lastName")
   private String lastName;

}

Subject.java

@Entity
@Table(name = "Subject")
@Data
@NoArgsConstructor
public class Subject implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name="studentId", nullable = false)
   private Student studentId;

   @Column(name = "subjectName")
   private String subjectName;

   @Column(name = "subjectCode")
   private int subjectCode;

}

SubjectRepository.java

@Repository
public interface SubjectRepository extends JpaRepository<Subject, Long> {


}

如上面的代码结构所示,我有 2 个实体(Student、Subject)和一个存储库类(SubjectRepository)。当我尝试保存到主题表中时,学生表中的学生姓名“Thomas”也会在数据库中更新。我只想插入主题表而不更新学生表中的任何值。在这方面需要一些帮助。谢谢!

public static void main(String[] args) {

    @Autowired protected SubjectRepository subjectRepository;

    Student student = new Student();
    student.setFirstName("Thomas");

    Subject subject = new Subject();
    subject.setSubjectName("Chemistry");
    subject.setSubjectCode(12345);

    student.addSubject(subject)

    subjectRepository.save(subject)

}

【问题讨论】:

  • 也许你的基地里没有学生...?
  • @Zorglube 忘了提到我的 postgres 数据库中已经有一个学生行。假设当前存储在 Student 表中的名字是“Vince”。当我运行 insertSubject 查询时,即使我的查询只是插入到主题表中,名字也会更新为“Thomas”。
  • 你到底为什么要麻烦使用 ORM 然后编写 SQL 查询来插入数据???????
  • @AlanHay 我可以使用一些建议来更好地插入/更新数据
  • 如果不先插入学生,您希望如何插入具有强制性student 引用的subject

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


【解决方案1】:

我只想插入主题表而不更新学生表中的任何值

您可以使用以下代码实现此目的:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="studentId", nullable = false, updatable = false)
private Student studentId;

【讨论】:

  • 我刚刚尝试添加 updatable = false 但学生表中的名字仍在更新。 @MaxExplode
【解决方案2】:

在使用 Spring JPA 时,我建议使用 JpaRepository API。您只需要传入您的实体,它应该可以根据需要保存。

例如: subjectRepository.save(主题);

【讨论】:

  • 我尝试过这样做,但学生表中的学生姓名仍然会更新。
【解决方案3】:

你已经尝试过了

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinColumn(name="studentId", nullable = false, updatable = false)
private Student studentId;

【讨论】:

    【解决方案4】:

    @MaxExplode 你必须使用 cascade = CascadeType.REFRESH 然后其他细节不会更新。但是如果您尝试设置 updateStudent.setfirstNamr(student.getFirstName());然后保存父对象然后我会更新。否则不会更新。

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多