【问题标题】:Spring JPA : Saving an entity Object in databaseSpring JPA:在数据库中保存实体对象
【发布时间】:2020-02-27 18:30:58
【问题描述】:

我有一个实体 CandidateTransactionCandidateTransactionRepository 扩展 CrudRepository

@Repository
public interface CandidateTransactionRepository extends CrudRepository<CandidateTransaction,Long>{
  //find methods 


}

    @Entity
    @Table(name = "ONB_CANDIDATE_TRANS")
    public class CandidateTransaction implements Serializable {

        private static final long serialVersionUID = 3615632069112078119L;

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer ID;
//other columns

我正在使用 CrudRepository 的保存方法来保存提到的实体的对象。 当实体不存在行时,它会创建一个自动生成的键并将其插入到 ID 列中,而不需要来自 java 端的干预。

并且由于 CrudRepository 的 save() 方法检查实体是否是新的,如果是新的,它会保存数据,否则它会调用 merge 方法来更新同一行。

理想情况下它应该处理这种情况,但在我的情况下,我必须专门检查具有特定值的行是否存在,如果存在则在现有对象中设置更新的值,然后保存它。

有没有办法解决这个问题。

if (candidateTransactionRepository.existsByCandidateIdAndTransactionType(candidateId, transactionType))
                candidate = candidateTransactionRepository.findByCandidateIdAndTransactionType(candidateId,transactionType);

            candidate = prepareTransactionProgressObjectToSave(candidateId, transactionType, transactionStatus);

            savedInstance = candidateTransactionRepository.save(candidate);

如果我必须保存同一​​实体的集合怎么办。

【问题讨论】:

  • 只保存实体会发生什么?
  • @JensSchauder 我在表中有一个唯一键列,如果该行存在则显示唯一键约束错误,但它应该更新该行。为此,我必须先获取行,然后调用保存。传统方式。
  • ID 设置了吗?它有吸气剂吗?如果不添加 getter 或将字段设为非私有。
  • @JensSchauder 吸气剂在那里,但字段是私有的。我会尝试将其设为非私有
  • 如果有getter,那就足够了。将 ID 重命名为 id 并确保将 getter 命名为 getId()

标签: java spring hibernate spring-data-jpa persistence


【解决方案1】:

理想情况下它应该处理这种情况,但在我的情况下,我必须专门检查具有特定值的行是否存在,如果存在则在现有对象中设置更新的值,然后保存它。

主键(属性“ID”)在您的表中是唯一的。如果一个实体在 save() 时没有设置主键(IDnull),那么 CrudRepository 会认为该实体之前没有保存并在数据库中创建一个新行。

您在保存前进行查找的技巧很常见。您通常使用查找器方法 (CrudRepository.findByPROPERTYNAME(...)) 通过其他属性/列来查找实体。 finder 方法返回的实体将具有非nullID

如果我必须保存同一​​实体的集合怎么办。

CrudRepository.saveAll() 是您的最佳选择,因为集合是一个 Iterable,因为该方法需要作为参数。

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 2011-06-18
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2018-02-07
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多