Hej。Springデータ+ JPA> "mappedBy"プロパティの新しいエントリは、SQL INSERT後にDBからフェッチされません
私はSpring Data、JPAなどと奇妙な動作をしていると思います。新しいデータをテーブルcash_entry_noteに挿入するフライウェイ移行スクリプトを作成しました。
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;
}
}
のスーパークラスである
@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<>();
:次のように実体AbstractCashEntry
に関連している
今私がすることいくつかの無地でシンプルな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の 'shared-cache-mode'オプションをgoogleに設定することもできます。 –
あなたが指揮している良いポイント、歓声。これは、アプリケーションの再起動後も問題が引き続き発生する場合にも当てはまります。 – Daniel
EhCacheのような永続化された第2レベルのキャッシュを使用している場合を除き、キャッシュを再起動する必要はありません。 –