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

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

JPA/Hibernate:傳遞給持久化的分離實體

JPA/Hibernate:傳遞給持久化的分離實體

瀟湘沐 2019-06-28 09:52:11
JPA/Hibernate:傳遞給持久化的分離實體我有一個JPA持久化的對象模型,它包含一個多對一的關系:一個帳戶有許多事務。交易只有一個帳戶。下面是代碼片段:@Entitypublic class Transaction {     @Id     @GeneratedValue(strategy = GenerationType.AUTO)     private Long id;     @ManyToOne(cascade = {CascadeType.ALL},fetch= FetchType.EAGER)     private Account fromAccount;....@Entitypublic class Account {     @Id     @GeneratedValue(strategy = GenerationType.AUTO)     private Long id;     @OneToMany(cascade = {CascadeType.ALL},fetch= FetchType.EAGER, mappedBy = "fromAccount")     private Set<Transaction> transactions;我能夠創(chuàng)建一個帳戶對象,向它添加事務,并正確地持久化帳戶對象。但是,當我創(chuàng)建一個交易時,使用現(xiàn)有的已持久化帳戶,并堅持交易我有個例外:Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.paulsanwald.Account     at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)因此,我能夠持久化一個包含事務的帳戶,而不是一個有帳戶的事務。我認為這是因為帳戶可能沒有附加,但這段代碼仍然給了我同樣的例外:if (account.getId()!=null) {     account = entityManager.merge(account);}Transaction transaction = new Transaction(account,"other stuff");  // the below fails with a "detached entity" message. why?entityManager.persist(transaction);如何正確保存與已持久化帳戶對象關聯(lián)的事務?
查看完整描述

3 回答

?
紅糖糍粑

TA貢獻1815條經(jīng)驗 獲得超6個贊

這是一個典型的雙向一致性問題。

您需要在雙向關系的兩邊修復設置者。

更正設置器后,要將實體訪問類型聲明為“Property”。聲明“Property”訪問類型的最佳實踐是將所有注釋從成員屬性移動到相應的getter。一個重要的警告是不要將“Field”和“Property”訪問類型混合在實體類中,否則JSR-317規(guī)范就沒有定義這種行為。


查看完整回答
反對 回復 2019-06-28
?
不負相思意

TA貢獻1777條經(jīng)驗 獲得超10個贊

解決方案很簡單,只需使用CascadeType.MERGE而不是CascadeType.PERSISTCascadeType.ALL.

我也有過同樣的問題CascadeType.MERGE為我工作過。

我希望你能解決。


查看完整回答
反對 回復 2019-06-28
?
jeck貓

TA貢獻1909條經(jīng)驗 獲得超7個贊

使用合并是危險和棘手的,因此在您的情況下,這是一個骯臟的解決方法。您至少需要記住,當您傳遞要合并的實體對象時,它停下來被附加到事務中,而是返回一個新的、現(xiàn)在附加的實體。這意味著,如果任何人仍然擁有舊的實體對象,則對其的更改將被靜默忽略,并在提交時丟棄。

您沒有在這里顯示完整的代碼,所以我不能再次檢查您的事務模式。要達到這樣的情況,一種方法是在執(zhí)行合并和持久化時沒有活動的事務。在這種情況下,持久性提供程序將為您執(zhí)行的每個JPA操作打開一個新事務,并在調用返回之前立即提交并關閉它。如果是這樣的話,合并將在第一個事務中運行,然后在Merge方法返回之后,事務被完成并關閉,返回的實體現(xiàn)在被分離。下面的持久化將打開第二個事務,并試圖引用一個被分離的實體,從而提供一個異常。始終將代碼包裝在事務中,除非您非常清楚自己在做什么。

使用容器管理的事務,它看起來像這樣。注意:這假設方法在會話bean中,并通過本地或遠程接口調用。

@TransactionAttribute(TransactionAttributeType.REQUIRED)public void storeAccount(Account account) {
    ...

    if (account.getId()!=null) {
        account = entityManager.merge(account);
    }

    Transaction transaction = new Transaction(account,"other stuff");

    entityManager.persist(account);}


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關注
  • 583 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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