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

如何在Spring JPA中设置foriegn键列

公冶嘉茂
2023-03-14

我正在使用Spring JPA并希望将值设置为外键列。这里是我的实体和存储库。


    @Entity
    public class Device {

      @NotEmpty
      @Id
      private String deviceId;

      @ManyToOne
      @JoinColumn(name="userId", referencedColumnName="userId", insertable=false, updatable=false)
      @NotFound(action=NotFoundAction.IGNORE)
      private User user;

      //Getters and setters
    }
    

    @Entity
    public class User(){

      @Id 
      private String userId;
      private String userName;
      //Getters and setters
    }
     

    public interface DeviceRepository extends PagingAndSortingRepository {

    }
 

    public class DeviceServiceImpl implements DeviceService {
        @Autowired
        private DeviceRepository devRepos;
        @Autowired
        private UserRepository userRepos;

        @Override
        public void saveDevice(Device device, String userId) {
           User user = null;
           if (userId!=null) {
               user = userRepos.findOne(userid);
               device.setUser(user);
           }

           deviceRepos.save(device);
        }
    }

该用户存在于Device表中,但表中的userId列未设置该值。请帮我解决这个问题。

那么,这意味着无论何时保存设备,我都必须从user表中获取设备的user?

共有1个答案

堵存
2023-03-14

由于您将device类中的user属性的insertable and updatable设置为false,因此在生成SQL INSERT和UPDATE语句时,这将导致持久性提供程序忽略此列(device.userid)。

只需将它们更改为true或删除它们,因为它们的默认值已经为true。

更新:

在纯JPA中,如果知道用户的ID,就可以使用EntityManager#getReference(user.class,aUserId)获得一个用户实例,而不需要实际从DB查询。但在Spring Data JPA中,似乎不支持这种方法。

 类似资料:
  • 如果我继续尝试持久化这个实体,我将得到中持久化。 做这件事的正确方法是什么。可能是我理解的不对。

  • 问题内容: 我想知道如何在Swing界面中调整Tab顺序。我找到了一个示例,它表明此方法可以解决问题,但似乎已弃用且不起作用。 注意:-下面的方法返回一个带有Argument名称的Combox对象。如果有人知道如何使用Netbeans IDE做到这一点,那就太好了。我在Eclipse WindowBuilder中找到了一种方法,但在Netbeans IDE中却找不到。谢谢。 问题答案: 您可以在容

  • 我需要创建3个如下所示的表 学生(SID:CHAR(12),SNAME:VARCHAR(50),BDATE:日期,地址:VARCHAR(50),SCITY:VARCHAR(20),年份:CHAR(20),GPA:FLOAT) 公司(CID:CHAR(8),CNAME:VARCHAR(20)) 应用(SID:CHAR(12),CID:CHAR(8)) (粗体属性为主键) 但是我不确定如何设置外键,因

  • 问题内容: 我在一个新的iOS Swift项目中使用Realm。我将Xcode 6.0.1与iOS SDK 8.0和Realm 0.85.0一起使用 我正在尝试使用新的Realm主键功能,以便可以进行操作。 这是一个示例模型: 以及我如何尝试添加/更新新对象: 我收到此错误: RLMExecption’,原因:“ Foo”没有主键,无法更新 这是主键上的文档。我可能没有正确设置它: http :

  • 如何在同一个字母中设置助记符解析。在我的项目中,在button中设置助记符,但button<code>setText</code>在每个事件操作中都会发生变化,但在<code>_o</code>中助记符是相同的,但短键只在一个事件中起作用。如何解决这个问题 抱歉,我的< code >英语

  • 我在一个新的iOS Swift项目中使用Realm。我使用Xcode 6.0.1和iOS SDK 8.0和Realm0.85.0 我正在尝试使用新的Realm主键特性,以便可以执行。 下面是一个示例模型: 以下是主键上的文档。我可能没有正确设置: <罢工> http://realm.io/docs/cocoa/0.85.0/api/classes/rlmobject.html#//api/name