java - Spring Data @JoinColumn 和实体更新
问题描述
首先,我没有给这个问题合适的标题。随时更新它。
问题陈述
我有以下实体:
@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
from设置1
为2
使用session.setLastScreenId(2)
我希望lastScreen
对象是具有 id 的对象2
所以这是我尝试过的:
只需更新
lastScreenId
. 我希望该lastScreen
对象会被更新,因为该session
对象仍然是一个MANAGED实体失败,因为
lastScreen
对象仍然是前一个对象使用 a更新
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); }
这个也失败了。
解决方案
您需要在同一对象中复制映射“last_screen_id”列的任何原因?
如果不是,我建议您将其更改为仅将其映射到Screen
更简单的实体:
@Entity
public class Session {
@JoinColumn(name = "last_screen_id", referencedColumnName = "id")
@OneToOne
private Screen lastScreen;
}
要将 Screen 从 ID 1 更新到 ID 2 ,您必须首先获取 new Screen 并将其设置为Session
的lastScreen.
Throw 异常,如果没有新的 ID Screen
:
public void updateSessionLastScreen(Long sessionId, Long newScreenId){
Session session = sessionRepository.findbyId(sessionId).orElseThrow(()-> new RuntimeException("Session does not exist"));
Screen newScreen = screenRepository.findById(newScreenId).orElseThrow(()-> new RuntimeException("Screen does not exist"));
session.setLastScreen(newScreen);
}
推荐阅读
- angularjs - 同时使用两个依赖模块?
- memory-management - Is reusing a variable but memory not being released by the process considered a memory leak?
- ios - Swift - 如何在不丢失清晰背景的情况下更改 png 色调颜色?
- functional-programming - 在 Elm 中,如何迭代地图?
- angular - Angular sass 不生成 css 文件
- jquery - Jquery.datatables 显示网格和交替颜色线 - 但不显示搜索或页码
- java - 为什么 JPanel 的子类“TwoButtons”没有显示在屏幕上
- python - Python 错误消息中 Mapbox 上的散点图
- php - 未捕获的错误:调用未定义的函数 get_file_html()
- javascript - Electron - 主窗口屏幕之间的平滑动画切换