【发布时间】:2020-02-27 18:30:58
【问题描述】:
我有一个实体 CandidateTransaction 和 CandidateTransactionRepository 扩展 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