2017-01-23 245 views
0

Hej之後,不會從數據庫中獲取「mappedBy」屬性的新條目。Spring Data + JPA>在SQL INSERT

我想我正在經歷一些與Spring Data,JPA和類似的奇怪行爲。我寫了一個飛橋遷移腳本,將新數據插入表cash_entry_note。

這是關係到一個實體AbstractCashEntry方式如下:

@Entity 
@Table(name = AbstractCashEntry.TABLE_NAME) 
@Inheritance(strategy = InheritanceType.JOINED) 
@Data 
@ToString(callSuper = true) 
@EqualsAndHashCode(of = "key", callSuper = false) 
@NoArgsConstructor 
abstract public class AbstractCashEntry extends TenantBaseModel { 

@OneToMany(mappedBy = "cashEntry", cascade = { CascadeType.ALL }) 
protected Set<CashEntryNote> notes = new HashSet<>(); 

這是CashEntry

@Entity 
@Table(name = "cash_entry") 
@Data 
@ToString(callSuper = true, exclude = "group") 
@EqualsAndHashCode(callSuper = true) 
@NoArgsConstructor 
public class CashEntry extends AbstractCashEntry { 

超類,最後是類CashEntryNote本身

@Entity 
@Table(name = "cash_entry_note") 
@Data 
@ToString(callSuper = true, exclude = "cashEntry") 
@EqualsAndHashCode(callSuper = true) 
@NoArgsConstructor 
@AllArgsConstructor 
public class CashEntryNote extends BaseModel { 

    @ManyToOne(optional = false) 
    private AbstractCashEntry cashEntry; 

    @ManyToOne(optional = false) 
    private Note note; 

    @ManyToOne(optional = false) 
    @DiffIgnore 
    private User reporter; 

    public LocalDateTime getDate() { 
     return createdAt; 
    } 
} 

現在我做了什麼一些簡單明瞭的SQL插入:

INSERT INTO [cash_entry_note] (created_at, modified_at, cash_entry, note, reporter) VALUES (GETDATE(), GETDATE(), @cash_key, @initial_note, 'username') 

在那之後,我預計JpaRepository返回CashEntry實體與連接的新的筆記,我最近剛插入。然而,這種情況並非如此。 CashEntry的屬性notes始終是一個空集或包含SQL插入之前已存在的註釋。即使嘗試使用FetchType.EAGER或重新啓動服務器,存儲庫也不會返回新插入的sql註釋。我錯過了什麼?有人有想法嗎?

我還應該提一下,這個項目使用[Javers] [1] http://javers.org/documentation/來跟蹤實體的變化,並在稍後的審覈日誌中提供。

+0

可能是一個緩存問題。默認情況下,JPA認爲它是唯一的客戶端,這意味着它非常積極地緩存,並且不會詢問數據庫是否已經加載了來自給定表的所有數據。如果您在持久性上下文之外修改數據,則需要禁用共享JPA高速緩存,這可以在全局或每個實體中完成。檢查http://stackoverflow.com/questions/4187344/how-to-disable-completely-hibernate-caching-with-spring-3-hibernate-with-anno。你也可能想要谷歌的JPA 2'共享緩存模式'選項 –

+0

您指導的好點也歡呼。當應用程序重新啓動後問題仍然存在時,這也適用? – Daniel

+0

當您重新啓動緩存時應該消失,除非您使用的是正在使用持久性二級緩存,如EhCache。 –

回答

0

明白了。 @cash_key變量以某種方式包含空格或選項卡或任何不可見的控制字符 - 但這並不妨礙它在插入前的where子句中進行比較,因此很難確定。

SELECT @cash_key = min(cash_key) FROM cash_entry這裏是責怪