こんにちは、私は初心者ですスプリングデータ JPAそして、エンティティにIDを渡しても、Spring Data JPAはマージではなく挿入しているのではないかと思っています。永続的インターフェースを作成し、2 つのメソッドを実装します。
public Long getId();
public Boolean isNew();
保持される代わりに自動的にマージされます。
次のような User というエンティティ クラスがあります。
@Entity
@Table(name = "T_USER")
public class User implements Serializable, Persistable<Long> {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "USER_ID")
private Long id;
@Column(name = "CREATION_TIME", nullable = false)
private Date creationTime;
@Column(name = "FIRST_NAME", nullable = false)
private String firstName;
@Column(name = "LAST_NAME", nullable = false)
private String lastName;
@Column(name = "MODIFICATION_TIME", nullable = false)
private Date modificationTime;
そして別のクラスを受講する
@Entity
@Table(name = "T_USER_ROLE")
public class UserRole implements Serializable, Persistable<Long> {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long roleId;
@Column(name = "ROLE_NAME")
private String userRole;
}
JpaReopistory を拡張した UserRepostory というカスタム リポジトリがあります。実装を見ると、Spring Data Jpa が上記の 2 つのメソッドを使用して更新または挿入を行っていることが分かるので、マージして保持するために保存を実行しています。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
ずっと考えてみたのですが、手がかりがありませんでした。皆さんが助けてくれるかもしれません。
ベストアンサー1
私はこの問題に遭遇し、実装しようとしましたがPersistable
うまくいかず、Spring Data JPAソースを調べました。あなたのサンプルコードでは必ずしもこれが表示されているわけではありませんが、私のエンティティにはフィールドがあります@Version
。フィールドがある場合、@Version
Spring Dataはテストしますそれエンティティが新規かどうかを判断する値。フィールドが@Version
プリミティブではなく null の場合、エンティティは新規であると見なされます。
これは、私のテストでは長い間私を困惑させました。なぜなら、表現のバージョン フィールドを設定せず、永続化されたエンティティにのみ設定していたからです。また、これについては、それ以外は役立つ Spring Data ドキュメントにも記載されていません (これは別の問題です...)。
誰かの役に立てれば幸いです!