簡體   English   中英

OneToOne上的EclipseLink PreUpdate關系未持久化

[英]EclipseLink PreUpdate on OneToOne Relationship not persisted

我有一個執行的PreUpdate方法,但是當刷新entityManager時,依賴實體的更改不會被持久化。

以下是我的最小(非)工作示例:

實體

@Entity
@Table(name = "HOUSE")
public class House {

    @Id
    @Column(name = "ID")
    private long id;

    @OneToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "INFO_ID")
    private HouseInfo info;

    @PreUpdate
    protected void komplettiereEingabeWerte() {
        info.setCode("TEST");
    }

    //getters and setters
}

@Entity
@Table(name = "HOUSE_INFO")
public class HouseInfo {

    @Id
    @Column(name = "ID")
    private long id;

    @Column(name = "CODE")
    private String code;

    //getters and setters
}

測試用例

@Test
@Transactional(TransactionMode.ROLLBACK)
public void testPreUpdate() {
    House house = entityManager.find(House.class, 1L);
    house.setInfo(new HouseInfo());
    entityManager.flush();
    entityManager.clear();

    house = entityManager.find(House.class, 1L);
    assertEquals("TEST", house.getInfo().getCode());
}

由於Code為null,因最后一行的AssertionError導致測試失敗。

我正在將EclipseLink版本2.7.4與Oracle DB一起使用(在內存Derby DB中也觀察到相同的行為),並且Test在SpringApplicationContext中與UnitilsJUnit4一起運行。

我該如何解決這個問題? 謝謝。

JPA Spec聲明:

通常,可移植應用程序的生命周期方法不應調用EntityManager或查詢操作, 訪問其他實體實例或修改同一持久性上下文中的關系。 生命周期回調方法可以修改調用它的實體的非關系狀態

簡單的答案是,實體監聽器不能用於任務。 而是在服務層中實現相關邏輯。

暫無
暫無

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

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