【问题标题】:Hibernate Updating a one-one unidirectionalHibernate 更新一对一的单向
【发布时间】:2017-03-04 13:36:56
【问题描述】:

您好,我目前正在花费大量时间来弄清楚为什么我的一对一休眠映射没有更新,你们能帮帮我吗?

顺便说一下,我是 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();
    }

}

提前谢谢大家

【问题讨论】:

  • 发布完成更新方法
  • 嗨@VikramSingh
  • 你试过我的答案了吗??
  • hi @mibrahim.iti,在我的代码中,我只将 ClassModel 插入到 BookingModel
  • @RyanDelaCruz 但是你只更新 BookingModel 而不是更新 ClassModel (关系的所有者),我认为这是你的问题,你能添加这个更新(classModel)吗?更新(预订)下的代码;告诉我发生了什么?所以你将更新这两个实体而不仅仅是一个,告诉我在这种情况下会发生什么,谢谢:)

标签: java spring hibernate jpa orm


【解决方案1】:

这是因为 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);

【讨论】:

    【解决方案2】:

    我认为问题在于@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
    

    您正在使用@GeneratedValueid 类型为String。不知道这对哪个数据库有效。通常整数类型与@GeneratedValue 一起使用,例如Long

    您的update() 方法中没有rolback()

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 2015-09-02
      • 2018-11-30
      • 2020-07-22
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多