嗨,我是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> {
}
我一直在想办法,但没有得到任何线索。也许你们能帮忙。
默认情况下,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);
}
}
无需实现持久接口
。
我遇到了这个问题,试图实现 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