首先,我缺少适当的标题来回答这个问题。随时更新。
问题陈述
我有以下实体:
@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
对象。例如,我使用lastScreenId
将1
从2
设置为session.setLastScreenId(2)
,我希望lastScreen
对象是ID为2
的对象>
这就是我尝试过的:
只需更新lastScreenId
。我期望lastScreen
对象会被更新,因为session
对象仍然是 MANAGED 实体
由于lastScreen
对象仍然是前一个对象而失败
更新lastScreenId
并使用session
保存SessionRepository
对象,并将当前的session
对象替换为保存在其中的新session
对象数据库
session= sessionRepository.save(screen);
由于未从数据库中提取lastScreen
对象,因此失败
使用另一种方法通过另一笔交易保存session
@Transactional(Transactional.TxType.REQUIRES_NEW)
public Session saveSessionInANewTransaction(Session session) {
return sessionRepository.save(session);
}
这也失败了。
答案 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.