我正在使用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列未设置该值。请帮我解决问题。
编辑: 我从注释中删除了insertable和updatable,现在它可以工作了。 @JoinColumn(name =“userId”,referencedColumnName =“userId”)
然后,这意味着每当我保存设备时,我必须从User表中获取设备的用户?
答案 0 :(得分:1)
因为您为false
类中的user
属性设置了insertable和updatable到Device
,所以会导致持久性提供程序忽略此列(Device.userId
)生成SQL INSERT和UPDATE语句。
只需将它们更改为true
或删除它们,因为它们的默认值已经为真。
更新:
这意味着我必须从User表中获取设备的用户 每当我保存设备?
在纯JPA中,如果您知道用户的ID,则可以使用EntityManager#getReference(User.class , aUserId)来获取用户实例,而无需实际查询数据库。但是在Spring Data JPA中,it seems that this method is not supported out of the box。