【发布时间】:2020-04-03 07:01:48
【问题描述】:
我有一个如下定义的投标实体
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@Entity
@Table(name = "bid_details")
public class Bid {
private enum STATUS { INITIATED, DRAFT, COMPLETED }
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Integer id;
@Column(name = "govt_bid_id", nullable = false)
private String govtBidNumber;
@Temporal(TemporalType.DATE)
@Column(name = "release_date", nullable = false)
@JsonFormat(pattern = "dd-MM-yyyy")
private Date releaseDate;
@ManyToOne(optional = false)
@JoinColumn(name = "created_by", referencedColumnName = "id", updatable = false, nullable = false)
private User createdBy;
@Temporal(TemporalType.DATE)
@Column(name = "created_date", nullable = false)
@CreationTimestamp
private Date createdDate;
@ManyToOne
@JoinColumn(name = "updated_by", referencedColumnName = "id", updatable = false, nullable = false)
private User updatedBy;
@Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false)
private STATUS status;
@Column(name = "avg_turnover")
private String avgTurnover;
@Convert(converter = StringListConverter.class)
@Column(name = "docs_required", columnDefinition = "json")
private List<String> docsRequired;
@Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false)
private STATUS status;
}
并且相应的列存在于bid_details 表中。我的投标存储库定义如下:
public interface BidRepository extends JpaRepository<Bid, Integer> {
}
现在,当我尝试使用 findById 通过 id 访问数据时,它会抛出 No Value Present 异常,而如果我尝试使用 findAllById 访问数据,我会得到正确的结果。无法弄清楚是什么导致了这种奇怪的行为。
另外,如果我先执行findAll,然后执行findById,它会给出正确的结果。
我使用的是 spring-boot 版本 2.1.1
以下是实体保存在数据库中的代码
public Bid addBid(BidRequest bidRequest) {
User user = userRepository.findById(bidRequest.getCreatedBy()).get();
Bid bid = new Bid();
modelMapper.map(bidRequest, bid);
bid.setCreatedBy(user);
return bidRepository.save(bid);
}
BidRequest 类如下:
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
public class BidRequest {
private String govtBidNumber;
@Temporal(TemporalType.DATE)
@JsonFormat(pattern = "yyyy-MM-dd")
private Date releaseDate;
@Temporal(TemporalType.DATE)
private Date endDate;
private int createdBy;
@Temporal(TemporalType.DATE)
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createdDate;
private int updatedBy;
private String status;
private List<String> docsRequired;
}
【问题讨论】:
-
这听起来像是 JPA 一级缓存的问题。你能展示在数据库中创建实体的代码吗?是否与尝试读取它在同一事务中?
-
事务边界在哪里?特别是关于
find*电话? -
什么是事务边界?
-
你为什么将 bidRequest.getCreatedBy 传递给 userRepository.findById 调用?当它需要一个整数 id 时,您正在传递一个用户对象。
标签: java spring-boot jpa spring-data-jpa spring-data