当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA插入而不是更新

马承
2023-03-14

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

public Long getId();
public Boolean isNew();

它将自动合并而不是持久化。

我有一个名为User like的实体类:

@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;
}

我有一个名为UserRepostory的自定义存储库,它扩展了JpaReopistory。当我看到实现演示SpringDataJpa使用以上两种方法来更新或插入时,我正在进行合并和持久化的保存。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

我一直在想办法,但没有得到任何线索。也许你们能帮忙。

共有2个答案

祁权
2023-03-14

默认情况下,Spring Data JPA检查给定实体的标识符属性。如果标识符属性为null,则该实体将被假定为新的,否则不是新的。它是Id-属性检查参考

如果你将Spring JPA与EntityManager一起使用,调用.merge()将更新你的实体,.persist()将插入。

@PersistenceContext
private EntityManager em;

@Override
@Transactional
public User save(User user) {

    if (user.getId() == null) {
        em.persist(user);
        return user;
    } else {
        return em.merge(user);
    }
}

无需实现持久接口

戚浩淼
2023-03-14

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

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

希望对某人有所帮助!

 类似资料:
  • 问题内容: 编辑。在扩展基本存储库类并添加insert方法的同时,一个更优雅的解决方案似乎是在实体中实现Persistable。查看 可能的解决方案2 我正在使用Hibernate作为ORM 创建服务。 遵循本教程的基础。 http://www.petrikainulainen.net/spring-data-jpa- tutorial/ 我的实体存储库扩展 我正在使用使用有意义的主键而不是自动生

  • Spring Boot 2.4.0,DB是MySql 8。 使用REST每15秒从远程获取数据并使用将其存储到MySql DB。 它为所有给定的实体调用save()方法。 所有数据都设置了ID。 我希望如果DB中没有这样的id-它将被插入。 如果这样的ID已经在DB中呈现-它将被更新。 这里是从控制台剪下的: 下面是获取和保存的方法,如下所示: 此方法每15秒运行一次。 实体: 和存储库: 这是以

  • 问题内容: 我有一个简单的测试,尝试在其中更新对象,但是合并似乎在执行插入操作而不是更新操作。 } 这是我的更新方法 更新代码 现在,我收到以下错误无法提交JPA事务;嵌套的异常是javax.persistence.RollbackException:标记为rollbackOnly的事务 问题答案: 我有一个版本列,当种子数据插入数据库时​​未设置该列。因此,所有有关更新和删除的问题

  • 我试图在spring jpa中更新多个表。正在更新使用者表,但提供者表无法更新。相反,它尝试插入导致违反主键,这是预期的,因为它尝试插入而不是更新。虽然我对这两个表的代码流是相同的,但只有生产者有问题。这是我的消费者实体 这是我的消费者存储库 这是我的提供商实体 这是我的提供商存储库 这是日志

  • 我有一个Spring Data JPA存储库接口,看起来像这样: 除了返回类型为HashMap的集合之外,是否有其他解决方法可以实现相同的效果

  • 我使用Spring Data、Spring Boot和Hibernate作为JPA提供程序,我想提高批量插入的性能。 我引用这个链接来使用批处理: http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch15.html 这是我的代码和应用程序。插入分批实验的属性。 我的服务: 与批处理相关的部分application.properti