Как я могу установить ключевой столбец foriegn в Spring JPA

Я использую 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);
        }
    }

Пользователь существует в таблице устройств, но столбец userId в таблице не устанавливает значение. Пожалуйста, помогите мне решить проблему.

РЕДАКТИРОВАТЬ: я удалил вставляемый и обновляемый из аннотации, и теперь он работает. @JoinColumn (name = "userId", referencedColumnName = "userId")

Тогда это означает, что я должен получать пользователя устройства из таблицы User всякий раз, когда я сохраняю устройство?


person sunghun    schedule 30.08.2013    source источник


Ответы (1)


Поскольку вы установили insertable и обновляемый до false для user в вашем Device классе, это приведет к тому, что поставщик сохраняемости будет игнорировать этот столбец (Device.userId) при создании операторов SQL INSERT и UPDATE.

Просто измените их на true или удалите, поскольку их значения по умолчанию уже верны.


Обновлять :

это означает, что я должен получать пользователя устройства из таблицы User каждый раз, когда я сохраняю устройство?

В чистом JPA, если вы знаете идентификатор пользователя, вы можете использовать EntityManager # getReference (User.class, aUserId), чтобы получить экземпляр пользователя без фактического запроса из БД. Но в Spring Data JPA, кажется, что этот метод не поддерживается "из коробки".

person Ken Chan    schedule 30.08.2013
comment
Спасибо, уже сделал. Меня беспокоит, что повлияет на приложение, если убрать опции. - person sunghun; 30.08.2013
comment
Эффект заключается в том, что до изменения вы не можете изменить значение столбца базы данных Device.userId с помощью JPA, поскольку он доступен только для чтения. После изменений вы можете изменить значение для этого столбца. - person Ken Chan; 30.08.2013