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/來跟蹤實體的變化,並在稍後的審覈日誌中提供。
可能是一個緩存問題。默認情況下,JPA認爲它是唯一的客戶端,這意味着它非常積極地緩存,並且不會詢問數據庫是否已經加載了來自給定表的所有數據。如果您在持久性上下文之外修改數據,則需要禁用共享JPA高速緩存,這可以在全局或每個實體中完成。檢查http://stackoverflow.com/questions/4187344/how-to-disable-completely-hibernate-caching-with-spring-3-hibernate-with-anno。你也可能想要谷歌的JPA 2'共享緩存模式'選項 –
您指導的好點也歡呼。當應用程序重新啓動後問題仍然存在時,這也適用? – Daniel
當您重新啓動緩存時應該消失,除非您使用的是正在使用持久性二級緩存,如EhCache。 –