2

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")

次に、これは、デバイスを保存するたびに User テーブルからデバイスのユーザーを取得する必要があることを意味しますか?

4

1 に答える 1

2

クラス のプロパティに対して挿入可能および更新可能を設定したため、 SQL INSERT および UPDATE ステートメントを生成するときに、永続化プロバイダがこの列 ( ) を無視するようになります。falseuserDeviceDevice.userId

デフォルト値はすでに true であるため、それらを変更するtrueか削除するだけです。


アップデート :

これは、デバイスを保存するたびに User テーブルからデバイスのユーザーを取得する必要があることを意味しますか?

純粋な JPA では、 user の ID がわかっている場合、EntityManager#getReference(User.class , aUserId)を使用して、実際に DB からクエリを実行せずに User インスタンスを取得できます。しかし、Spring Data JPA では、このメソッドはそのままではサポートされていないようです

于 2013-08-30T03:21:45.937 に答える