java如何在不需要主键的情况下通过JPA持久化数据
我的应用程序中有数据,通常不需要麻烦,但要实现一个新功能,我需要临时存储它(例如1小时)。输入的数据可以与已经存在的数据完全相同,因此不需要主键。然而,JPA实体需要一个Id,但我不需要/想要一个。这让我无法工作
这是通过Spring使用JPA实现的。由于数据经常进出数据库,因此不鼓励使用自动生成的ID,因为它会在几年后通过ID。我曾尝试将其嵌入其中,它说我需要进行组件扫描,以找到它的使用位置,但如果我将其作为实体,它会给我一个错误,即它需要主键
这是我的实体,它存储我需要保存的数据
@Entity
@Table(name = "quoteOrderHistory")
public class QuoteOrderHistory {
@Column(name = "storeNumber")
private int storeNumber;
@Column(name = "invoiceNumber")
private String invoiceNumber;
@Column(name = "quoteSaleDate")
private Date quoteSaleDate;
@Column(name="orderTotal")
private BigDecimal orderTotal;
@Column(name="orderHistoryDate")
private Timestamp orderHistoryDate;
// Constructors, Getters and Setters
}
这是我访问数据的存储库
@Repository
public interface QuoteOrderHistoryRepository extends JpaRepository<QuoteOrderHistory, Long> {
@Query("DELETE FROM QuoteOrderHistory q WHERE q.orderHistoryDate > date")
void deleteAllExpired(Date date);
@Query("SELECT q FROM QuoteOrderHistory q WHERE q.storeNumber = ?1 AND q.invoiceNumber = ?2 ORDER BY q.orderHistoryDate DESC")
List<QuoteOrderHistory> findAllByStoreAndInvoiceDesc(int storeNumber, String invoiceNumber);
}
我不知道该怎么做。同样,主键也不需要,因为它应该支持重复的条目。如果有其他方法不使用JPA,那么我完全赞成,但目前看来,它似乎是最容易保存数据的方法。如果你需要更多信息,请告诉我。我也可能错过了一些可以避免这一切的方法,但我对JPA不太熟悉。因此,我们非常感谢您的帮助
# 1 楼答案
如果使用了正确的大小,就不应该用完列的ID。不要再试图对抗你的框架了,只需添加一个自动递增的列即可
https://hashrocket.com/blog/posts/running-out-of-ids
从How large can an id get in postgresql
如果你因为某种我无法理解的原因而不顾一切地不使用id列,那么你可以在JPA中通过使每一列成为主键描述的一部分来做到这一点,但是你的删除和更新将删除/更新任意数量的记录。我没有试过这个。我不会在生产服务器上实现这一点
https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#No_Primary_Key
# 2 楼答案
Jazzepi说的是正确的,但我被严格要求不要使用自动生成的数字作为ID。因此,人们用UUID链接了这个here描述。这是解决这个问题的最佳选择,因为数据库中的对象被计时在那里不超过几个小时。既然是这种情况,UUID永远不会溢出,而且在任何给定时间表中重复UUID的可能性几乎为零,因为大多数UUID不会留在表中
新实体类: