Hibernate更新一对一单向

时间:2017-03-04 13:36:56

标签: java spring hibernate jpa orm

您好,我现在花了很多时间弄清楚为什么我的一对一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();
    }

}

先谢谢你们

2 个答案:

答案 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。此注释意味着BookingModelClassModel应具有相同的主键。

例如,这应该有效(没有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()