您好,我现在花了很多时间弄清楚为什么我的一对一hibernate映射没有更新,你们可以帮助我。
顺便说一句,我是hibernate的新手
这是 BookingModel.java
@Entity
@Table(name="booking")
public class BookingModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
String id;
@ManyToOne
@JoinColumn(name="teacher", nullable=false)
@JsonManagedReference
TeacherModel teacher;
@OneToOne(mappedBy="bookingModel", cascade=CascadeType.ALL)
ClassModel classModel;
@Column(name="start")
Date start;
@Column(name="end")
Date end;
@Column(name="title")
String title;
//getters and setters
}
这是 ClassModel.java
@Entity
@Table(name="class")
public class ClassModel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private String id;
@ManyToOne
@JoinColumn(name="student")
private StudentModel student;
@OneToOne
@PrimaryKeyJoinColumn
BookingModel bookingModel;
//getters and setters
}
这就是我试图实现的方法
BookingModel booking = find(scheduleId);
ClassModel classModel = classDao.getClass(classId);
classModel.setBookingModel(booking);
booking.setClassModel(classModel);
booking.setTitle("TEST");
update(booking);
setTitle正在运行,但我的数据库中的类字段仍为空
这是更新方法
@Transactional
@Override
public void bookClass(String classId, String scheduleId) {
org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
BookingModel booking = find(scheduleId);
ClassModel classModel = classDao.getClass(classId);
classModel.setBookingModel(booking);
booking.setClassModel(classModel);
booking.setTitle("TEST");
update(booking);
}
@Override
public void update(E entity) {
try{
Transaction t = currentSession().beginTransaction();
currentSession().update(entity);
t.commit();
}catch(Exception e){
e.printStackTrace();
}
}
先谢谢你们
答案 0 :(得分:0)
那是因为BookingModel实体不是关系的所有者。
如果你试过
@OneToOne(cascade=CascadeType.ALL)
ClassModel classModel;
而不是
@OneToOne(mappedBy="bookingModel", cascade=CascadeType.ALL)
ClassModel classModel;
带
@OneToOne(mappedBy="classModel")
@PrimaryKeyJoinColumn
BookingModel bookingModel;
而不是
@OneToOne
@PrimaryKeyJoinColumn
BookingModel bookingModel;
所以它应该适用于这种情况
或者你也可以这样做,它应该可以在不改变实体的情况下工作
BookingModel booking = find(scheduleId);
ClassModel classModel = classDao.getClass(classId);
booking.setTitle("TEST");
update(booking);
classModel.setBokingModel(booking);
update(classModel);
答案 1 :(得分:0)
我认为问题是@PrimaryKeyJoinColumn
。此注释意味着BookingModel
和ClassModel
应具有相同的主键。
例如,这应该有效(没有update()
语句):
BookingModel booking = new BookingModel();
booking.setId("booking");
save(booking);
ClassModel classModel = new ClassModel();
classModel.setId("booking");
save(classModel);
BookingModel savedBooking = get(booking.getId());
savedBooking.getClassModel();// we will have a classModel here
您使用的@GeneratedValue
id
类型为String
。不知道哪个数据库有效。通常,整数类型与@GeneratedValue
一起使用,例如Long
。
rolback()
方法中没有update()
。