当前位置: 首页 > 知识库问答 >
问题:

Spring Data@JoinColumn和实体更新

晏树
2023-03-14

问题陈述

我有以下实体:

@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对象。例如,我使用会话将LastScreenId1设置为2。SetLastScreenId(2)我希望LastScreen对象是id为2的对象

更新LastScreenId并使用SessionRepository保存Session对象,并将当前的Session对象替换为保存在数据库中的新的Session对象

session=SessionRepository.Save(屏幕);

失败,因为未从数据库中提取lastscreen对象

 @Transactional(Transactional.TxType.REQUIRES_NEW)
 public Session saveSessionInANewTransaction(Session session) {

     return sessionRepository.save(session);

 }

这个也失败了。

共有1个答案

东门清夷
2023-03-14

您需要在同一个对象中重复映射“last_screen_id”列的原因是什么?

如果没有,我建议您将其更改为仅将其映射到一个屏幕实体,该实体要简单得多:

@Entity
public class Session {

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

}

若要将屏幕从ID%1更新为ID%2,您必须首先获取新屏幕,并将其设置为会话最后屏幕。如果没有新屏幕的ID,则引发异常:

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);
}
 类似资料:
  • 我有两个实体 实体1 实体2 我对Jpa不是很熟悉,所以如果您需要对我的问题进行任何澄清,或者您需要任何更多的信息,请告诉我。

  • 我正在尝试在我的Spring数据服务中使用查询DSL来实现类似于SQL的查询 成员可以是项目或黑客马拉松的成员。项目是黑客马拉松的一部分。我试图找到哈查顿和子项目的所有成员。 因为谓词产生了交叉连接,所以QueryDslPredicateExecutor接口对我不起作用: 我尝试过使用JPAQuery来手动管理连接策略,但是也遇到了同样的问题: Hibernate:选择memberenti0_.i

  • 我有一个User类,它有一些附加属性: 现在,如果我调用一些方法来改变其中一个房子(例如改变它的名称属性),如果我调用,我仍然会得到房子的旧值: 我如何确保它总是更新?

  • 主要内容:JPA实体更新示例JPA允许我们通过更新实体来更改数据库中的记录。 JPA实体更新示例 在这里,我们将演示如何根据主键更新学生的年龄。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码如下 - 在包下

  • 我有这些桌子: 我需要使用Spring构建一个RESTful Web服务,它接收JSON并在验证后将它们保存到数据库中。例如,在中有一条带有的记录。因此的JSON如下所示: 我想这样做: 我拥有以下实体: 在这种情况下,person中的doc总是为null,这很容易理解。但是如何实现我需要的行为呢?

  • 在Symfony 2(最新版本)下,我试图更新我的实体: 我得到了这个错误消息到我的终端: [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException] 无法识别的选项“security.firewalls.access\u control”下的“0、1、2、3” 我是Symfony的新手,我不知道在哪里