Spring Data JPA插入而不是Update

Ros*_*ion 16 spring jpa spring-data-jpa

嗨,我是Sprig Data JPA的新手,我很想知道即使我将Id传递给实体,Spring数据jpa也是插入而不是合并.我想当我实现Persistable接口并实现这两个方法时:

public Long getId();
public Boolean isNew();
Run Code Online (Sandbox Code Playgroud)

它会自动合并而不是持久化.

我有一个名为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;
Run Code Online (Sandbox Code Playgroud)

还有另一堂课

@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;
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为UserRepostory的自定义存储库,扩展了JpaReopistory.因为我看到实现证明Spring Data Jpa使用以上两种方法进行更新或插入,所以我正在点击合并和保存.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
Run Code Online (Sandbox Code Playgroud)

我一直想弄清楚,但没有得到任何线索.也许你们可以提供帮助.

小智 40

我遇到了这个问题,试图实现Persistable无济于事,然后查看Spring Data JPA源代码.我不一定在你的示例代码中看到这个,但@Version我的实体中有一个字段.如果有一个@Version字段,Spring Data将测试值以确定该实体是否是新的.如果该@Version字段不是原始字段且为null,则该实体被视为新实体.

这让我在测试中花了很长时间,因为我没有在我的表示中设置版本字段,而只在持久化实体上设置.我也没有在其他有用的Spring Data文档中看到这个(这是另一个问题......).

希望有人帮助!