2017-01-23 1 views
0

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/を使用して、エンティティの変更を追跡し、後で監査ログに提供することを言及する必要があります。

+0

キャッシングに関する問題があります。デフォルトでは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に設定することもできます。 –

+0

あなたが指揮している良いポイント、歓声。これは、アプリケーションの再起動後も問題が引き続き発生する場合にも当てはまります。 – Daniel

+0

EhCacheのような永続化された第2レベルのキャッシュを使用している場合を除き、キャッシュを再起動する必要はありません。 –

答えて

0

@cash_keyには何らかの形で空白やタブ、または見えない制御文字が含まれていましたが、挿入前のwhere節での比較では機能しませんでしたので、正確に特定できませんでした。

SELECT @cash_key = min(cash_key) FROM cash_entryここに責任があります

関連する問題