提问人:Mohammad Karmi 提问时间:11/16/2023 最后编辑:Mohammad Karmi 更新时间:11/16/2023 访问量:36
@EmbeddedId主键,持久化后对象不被管理
@EmbeddedId primary key , object not managed after persist
问:
我在下表上有一个带有 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
}
答:
0赞
Mohammad Karmi
11/16/2023
#1
它不起作用的原因是主键不是 null ,因此 Spring 会将实体视为合并而不是持久化。在合并中返回一个新的托管实体,因此我需要使用保存中返回的实体:
course= courseRepository.save(course);
course.setName("test");
评论
save