@EmbeddedId主键,持久化后对象不被管理

@EmbeddedId primary key , object not managed after persist

提问人:Mohammad Karmi 提问时间:11/16/2023 最后编辑:Mohammad Karmi 更新时间:11/16/2023 访问量:36

问:

我在下表上有一个带有 Composote 键的实体: 1-用户 2-部门

我正在使用 Spring Data 通过 JpaRepository 的 save 方法保存实体,现在如果我在同一事务中保存后更新实体,则不会发生更新,这是通过使用同一@Transactional中的 setter 方法更新字段来完成的。

似乎我保存的实体(新实体)没有被管理。那是因为实体 primar 键不是 Long/Integer 吗?


更新:如果我使用从保存中返回的实体,它就可以工作了,我认为因为主键不是空的,Spring会将其视为合并而不是持久,因此用于保存的实体与返回的实体不同。

@Entity
@Table(name = "user")
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User{

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


  private String username;

}

@Entity
@Table(name = "department")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Department {

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

@Entity
@Table(name = "COURSE")
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class Course  {

  @EmbeddedId private CourseId courseId;
  
  private String name;
}



@Embeddable
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class CourseId implements Serializable {

  @ManyToOne
  @JoinColumn(name = "USER_ID")
  private User user;

  @ManyToOne
  @JoinColumn(name = "DEPARTMENT_ID")
  private Department department;
}


public interface CourseRepository  extends JpaRepository<Course, CourseId> {


}


@Transactional
public void createCourse(){
    
    User user=userRepository.findOneByName("user1");
    Department department=departmentRepository.findOneByName("department");
    CourseId courseId=new CourseId(user,department);
    Course course=new Course();
    course.setCourseId(courseId);
    courseRepository.save(course);// here it works
    course.setName("test"); // this doesn't update


}
Java Spring 休眠 JPA

评论

0赞 M. Deinum 11/16/2023
请出示代码,而不是代码说明。
0赞 Mohammad Karmi 11/16/2023
@M.Deinum 请检查,用代码更新
0赞 M. Deinum 11/16/2023
您自己已经弄清楚了,请始终使用从方法返回的实体。save

答:

0赞 Mohammad Karmi 11/16/2023 #1

它不起作用的原因是主键不是 null ,因此 Spring 会将实体视为合并而不是持久化。在合并中返回一个新的托管实体,因此我需要使用保存中返回的实体:

course= courseRepository.save(course);
 course.setName("test");