【发布时间】:2014-12-28 04:05:20
【问题描述】:
嗨,我是 Spring Data JPA 的新手,我想知道即使我将 Id 传递给实体,Spring 数据 jpa 是插入而不是合并。我想当我实现Persistable接口并实现这两个方法时:
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。我正在保存合并和持久化,因为我看到实现表明 Spring Data Jpa 使用上述两种方法来更新或插入。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
我一直在试图弄清楚,但没有得到任何线索。可能是你 小伙伴们可以帮忙。
【问题讨论】:
-
你不需要实现持久化接口。只需使用继承的
save,Spring Data 就会为您处理。 -
@Rana_S 你是如何解决这个问题的?我有一个非常相似的问题:why saveAll() always inserts data instead of update it?
-
@catch23 我在数据库中有版本列,在实体字段上标记了
@Version,在持久化时丢失了。所以必须填充版本字段并工作。看到你的帖子,尝试添加版本列,看看它是如何反应的。此外,建议实施更好的equals和hashCode而不仅仅是 id。 -
@Rana_S 感谢您的回复。试过这种方法。抛出相同的异常。但是,版本参数始终为空 - 因为它是从远程获取的,并且未显示此字段。因此,实体总是被视为“新”
-
@catch23 所以你是说你有版本栏?如果是这样,那么 Spring 将对此进行评估。看看这个saving Entities Strategies。如果你没有使用版本,那么删除就可以了。
标签: spring jpa spring-data-jpa