第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何使用 Spring Data JPA 保存具有手動分配標(biāo)識符的實(shí)體?

如何使用 Spring Data JPA 保存具有手動分配標(biāo)識符的實(shí)體?

蕪湖不蕪 2023-06-21 14:48:33
我正在更新現(xiàn)有代碼,該代碼處理從一個(gè)表到同一數(shù)據(jù)庫中多個(gè)對象的復(fù)制或原始數(shù)據(jù)。以前,每種對象都有一個(gè)使用每個(gè)表的序列生成的 PK。像這樣的東西:@Id@Column(name = "id")@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;為了重用導(dǎo)入表中的現(xiàn)有 ID,我們刪除了某些實(shí)體的 generatedValue,如下所示:@Id@Column(name = "id")private Integer id;對于這個(gè)實(shí)體,我沒有更改我的 JpaRepository,如下所示:public interface EntityRepository extends JpaRepository<Entity, Integer> {    <S extends Entity> S save(S entity);}現(xiàn)在,我正在努力理解具有默認(rèn)傳播和隔離級別的 spring 事務(wù) (@Transactional) 中的以下行為:通過實(shí)體上的@GenerateValue,當(dāng)我調(diào)用entityRepository.save(entity)時(shí),我可以看到Hibernate顯示sql激活了一個(gè)插入請求被觸發(fā)(但是似乎只在緩存中,因?yàn)閿?shù)據(jù)庫沒有改變)如果實(shí)體上沒有 @GeneratedValue,只會觸發(fā)一個(gè)選擇請求(不會嘗試插入)當(dāng)我的實(shí)體(沒有生成的值)在一個(gè)或多個(gè)關(guān)系中映射到 MyOtherEntity(有生成的值)時(shí),這是一個(gè)大問題。因此我有以下錯(cuò)誤:ERROR: insert or update on table "t_other_entity" violates foreign key constraint "other_entity_entity"Détail : Key (entity_id)=(110) is not present in table "t_entity"似乎合法,因?yàn)樯形礊閷?shí)體發(fā)送插入,但為什么呢?同樣,如果我更改實(shí)體的 ID 并使用 @GeneratedValue,我不會收到任何錯(cuò)誤。我正在使用 Spring Boot 1.5.12、Java 8 和 PostgreSQL 9
查看完整描述

1 回答

?
萬千封印

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊

您基本上是從自動分配的標(biāo)識符切換到手動定義的標(biāo)識符,這在 JPA 和 Spring Data 級別上都會產(chǎn)生一些后果。

數(shù)據(jù)庫操作時(shí)序

在普通 JPA 級別,持久性提供程序不一定需要立即執(zhí)行單個(gè)插入,因?yàn)樗槐孬@取標(biāo)識符值。這就是為什么它通常會延遲語句的執(zhí)行,直到它需要刷新,這是在顯式調(diào)用 、EntityManager.flush()查詢執(zhí)行時(shí),因?yàn)檫@需要數(shù)據(jù)庫中的數(shù)據(jù)是最新的以提供正確的結(jié)果或事務(wù)提交。

Spring Data JPA 存儲庫在調(diào)用save(…).?但是,如果您在依次注釋為的方法中調(diào)用存儲庫@Transactional,則在離開該方法之前可能不會發(fā)生數(shù)據(jù)庫交互。

EntityManager.persist(…)對比。….merge(…)

JPA 要求EntityManager客戶端代碼區(qū)分是持久保留全新實(shí)體還是對現(xiàn)有實(shí)體應(yīng)用更改。Spring Data 存儲庫希望使客戶端代碼免于處理這種區(qū)別,因?yàn)闃I(yè)務(wù)代碼不應(yīng)因該實(shí)現(xiàn)細(xì)節(jié)而過載。這意味著 Spring Data 必須以某種方式將新實(shí)體與現(xiàn)有實(shí)體區(qū)分開來。

在手動標(biāo)識符的情況下,默認(rèn)檢查標(biāo)識符屬性的null值將不起作用,因?yàn)樵搶傩杂肋h(yuǎn)不會被null定義。標(biāo)準(zhǔn)模式是調(diào)整實(shí)體以實(shí)現(xiàn)Persistable并保留瞬態(tài) is-new-標(biāo)志,并使用實(shí)體回調(diào)注釋來翻轉(zhuǎn)標(biāo)志。

@MappedSuperclass

public abstract class AbstractEntity<ID extends SalespointIdentifier> implements Persistable<ID> {


? private @Transient boolean isNew = true;


? @Override

? public boolean isNew() {

? ? return isNew;

? }



? @PrePersist

? @PostLoad

? void markNotNew() {

? ? this.isNew = false;

? }


? // More code…

}

isNew被聲明為暫時(shí)的,以便它不會被持久化。該類型實(shí)現(xiàn)Persistable以便存儲庫save(…)方法的 Spring Data JPA 實(shí)現(xiàn)將使用它。上面的代碼會導(dǎo)致使用new將標(biāo)志設(shè)置為 的用戶代碼創(chuàng)建實(shí)體true,但任何類型的數(shù)據(jù)庫交互(保存或加載)都會將該實(shí)體轉(zhuǎn)換為現(xiàn)有實(shí)體,因此,除了所有后續(xù)操作外,這將首先save(…)觸發(fā)。EntityManager.persist(…)….merge(…)


我借此機(jī)會創(chuàng)建了DATAJPA-1600并將此描述的摘要添加到參考文檔中。


查看完整回答
反對 回復(fù) 2023-06-21
  • 1 回答
  • 0 關(guān)注
  • 175 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號