如何在 Spring JPA 中设置外键列

Posted

技术标签:

【中文标题】如何在 Spring JPA 中设置外键列【英文标题】:How can I set foriegn key column in Spring JPA 【发布时间】:2013-09-02 16:15:47 【问题描述】:

我正在使用 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 列未设置值。请帮我解决问题。

编辑: 我从注释中删除了可插入和可更新的,现在它可以工作了。 @JoinColumn(name="userId", referencedColumnName="userId")

那么,这意味着每当我保存设备时,我都必须从用户表中获取设备的用户?

【问题讨论】:

【参考方案1】:

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

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


更新:

这意味着我必须从用户表中获取设备的用户 每当我保存设备时?

在纯 JPA 中,如果您知道用户的 ID,则可以使用 EntityManager#getReference(User.class , aUserId) 获取 User 实例,而无需从数据库中实际查询。但是在 Spring Data JPA 中,it seems that this method is not supported out of the box.

【讨论】:

谢谢,我已经做到了。我担心删除选项会影响应用程序。 影响是在更改之前,您无法使用JPA更改数据库列Device.userId的值,因为它是只读的。更改后,您可以更改该列的值。

以上是关于如何在 Spring JPA 中设置外键列的主要内容,如果未能解决你的问题,请参考以下文章

如何在MySQL中设置外键约束以及外键的作用

如何在 SQL Azure 中设置外键?

在 phpMyAdmin 中设置外键

当父记录存在时,如何在 django rest 框架的子序列化程序中设置外键值

在 phpMyAdmin 中设置外键?

在 phpMyAdmin 中设置外键?