簡體   English   中英

保存后Spring Data存儲庫不加載關系

[英]Spring Data repository doesn't load relationship after save

保留Book對象后,Insert上的觸發器將運行以創建事務記錄(在單獨的表中)。

當我創建Book實例並將其保存時,我希望可以在transactions()數組中看到該記錄,但是它一直是空的。

Book book = new Book("Moby Dick", "Melville", "hardcover");
book = bookRepository.saveAndFlush(book);
if( book != null)
    assertTrue("There is no transaction history", book.transactions().size() > 0 );

這總是失敗。 這樣做也是如此(我的旋轉嘗試重新加載數據):

public int addBook()
{
    int bookID;
    Book book = new Book("Moby Dick", "Melville", "hardcover");
    book = bookRepository.saveAndFlush(book);
    if( book != null)
        bookID = book.getID();
    return bookID;
}

@Test
public void testNewBookTrans()
{
    int aBook = addBook();
    bookRepository.findAll();
    transactionRepository.findAll();
    Book book = bookRepository.findOne(bookID);
    if( book != null )
        assertTrue("Still no transactions", book.getTransactions().size() > 0);
}

但是,如果我讓此測試失敗,請重新啟動JUnit,然后查詢同一本書,它具有觸發器添加的事務。

因此,必須有某種方法可以使數據庫緩存無效或重新加載它,但我沒有看到它。

那是正常行為,導致新實體實例被緩存。 您必須刷新它。

看到這個答案

編輯:回應您的評論。

關於緩存范圍,取決於您如何在所用的應用程序和平台中對其進行操作。 在常見的容器管理的事務和持久性上下文情況下,“ * 1級”高速緩存作用域附加到持久性上下文,而生命周期取決於基礎事務。 它在事務作用域開始時創建,並在事務作用域結束時處置。

我想,所提到的解決方案是不可行的你,因為你不想計較refershing實例及其集合中的每個你已經找到地方。 因此,如果提到了持久性上下文的范圍,則可以在保存實例並調用flush方法之后執行技巧來引用實例。

我的意思是,您只需要在保存實例並刷新之后就將代碼編輯為refersh(必須刷新到數據庫)即可。

Book book = new Book("Moby Dick", "Melville", "hardcover");
book = bookRepository.saveAndFlush(book);
book = bookRepository.refresh(book);
if( book != null)

使用refresh方法(您可能必須實現custom方法 )之后,您將獲得該書及其集合的最新信息。

如果您想刷新關聯的事務實體(它們是實體?),您也可以將CascadeType.REFRESH添加到Book.transactions集合中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM