Spring Data @JoinColumn和实体更新

时间:2019-08-15 06:35:58

标签: java hibernate spring-data-jpa

首先,我缺少适当的标题来回答这个问题。随时更新。

问题陈述

我有以下实体:

@Entity
public class Session {
    @Column(name = "last_screen_id")
    private Long lastScreenId;

    @JoinColumn(name = "last_screen_id", referencedColumnName = "id", insertable = false, updatable = false)
    @OneToOne
    private Screen lastScreen;

    // Getters and setters for lastScreenId
    // Getter for lastScreen (I don't have a setter for lastScreen object since lastScreen object is marked as insertable=false and updatable=false)
}

如果我更新lastScreenId,我想更新lastScreen对象。例如,我使用lastScreenId12设置为session.setLastScreenId(2),我希望lastScreen对象是ID为2的对象

这就是我尝试过的:

  1. 只需更新lastScreenId。我期望lastScreen对象会被更新,因为session对象仍然是 MANAGED 实体

    由于lastScreen对象仍然是前一个对象而失败

  2. 更新lastScreenId并使用session保存SessionRepository对象,并将当前的session对象替换为保存在其中的新session对象数据库

    session= sessionRepository.save(screen);

    由于未从数据库中提取lastScreen对象,因此失败

  3. 使用另一种方法通过另一笔交易保存session

     @Transactional(Transactional.TxType.REQUIRES_NEW)
     public Session saveSessionInANewTransaction(Session session) {
    
         return sessionRepository.save(session);
    
     }
    

    这也失败了。

1 个答案:

答案 0 :(得分:0)

您是否需要重复映射同一对象中的“ last_screen_id”列?

如果不是,建议您将其更改为仅将其映射到Screen实体,这要简单得多:

@Entity
public class Session {

    @JoinColumn(name = "last_screen_id", referencedColumnName = "id")
    @OneToOne
    private Screen lastScreen;

}

要将屏幕从ID 1更新为ID 2,必须首先获取新屏幕,并将其设置为Session的{​​{1}},如果新{{ 1}}:

lastScreen.
相关问题