簡體   English   中英

Hibernate One to Many Mapping試圖將映射列更新為null

[英]Hibernate One to Many Mapping is trying to update mapping column to null

我正在使用下面的映射

@Entity
@Table(name = "test")
public class TestOrder implements Serializable {

    @Id
    @Column(name = "orderid", updatable = false)
    protected Long orderId;

    @OneToMany(cascade = {CascadeType.ALL})
    @JoinColumn(name = "order_id_fk")
    private List<TestDetails> details;

//getters and setters
}

@Entity
@Table(name="test_details")
public class TestDetails implements Serializable {

    @Id
    //Generator
    @Column(name = "id", updatable = false, insertable = false)
    protected Long id;

    @Column(name="order_id_fk", updatable = false)
    private Long orderId;
//getters and setters
}

當我更新/插入數據時,它正在嘗試將order_id_fk更新為null

SQL [update test_details set order_id_fk'='null where order_id_fk'='? and id'='?]; constraint [null];

任何幫助深表感謝。

使用Spring Integration更新/插入

<int-jpa:updating-outbound-gateway entity-class="com.aaaa.TestOrder" entity-manager-factory="myEntityManagerFactory" persist-mode="MERGE">
    <int-jpa:transactional propagation="REQUIRED" transaction-manager="myTransactionManager" />
</int-jpa:updating-outbound-gateway>

您需要急切地獲取TestDetails實體的值。

只需在注釋中修改,

@OneToMany(fetch = FetchType.EAGER, mappedBy="testOrder", cascade=CascadeType.ALL)

希望這會奏效。

我運行了你的代碼並且它正常工作(將@GeneratedValue(strategy = GenerationType.AUTO)到兩個ID)。

em.getTransaction().begin();
TestOrder to = new TestOrder();
TestDetails td1 = new TestDetails();
TestDetails td2 = new TestDetails();
TestDetails td3 = new TestDetails();
to.setDetails(Arrays.asList(new TestDetails[] {td1, td2, td3}));
em.persist(to);
em.getTransaction().commit();

什么導致以下sqls:

[03/07/14 10:03:30]  INFO jdbc.sqlonly: insert into test (orderid) values (1) 
[03/07/14 10:03:30]  INFO jdbc.sqlonly: insert into test_details (order_id_fk, id) values (NULL, 2) 
[03/07/14 10:03:30]  INFO jdbc.sqlonly: insert into test_details (order_id_fk, id) values (NULL, 3) 
[03/07/14 10:03:30]  INFO jdbc.sqlonly: insert into test_details (order_id_fk, id) values (NULL, 4) 
[03/07/14 10:03:30]  INFO jdbc.sqlonly: update test_details set order_id_fk=1 where id=2 
[03/07/14 10:03:30]  INFO jdbc.sqlonly: update test_details set order_id_fk=1 where id=3 
[03/07/14 10:03:30]  INFO jdbc.sqlonly: update test_details set order_id_fk=1 where id=4

因此,如果您發布的代碼是您編譯的代碼,則TestOrder實體無法生成其ID(缺少@GeneratedValue注釋)。

如果數據庫為此實體生成ID(即使用自動編號),則應將@GeneratedValue設置為IDENTITY以使您的jpa提供程序知道它必須在之后重新讀取插入的行。 如果jpa提供程序無法重新讀取id,則會使用null更新test_details order_id_fk列。

PS。 為什么不在TestDetails端設置多對一關系?

您可能需要更改下面的實體。 據我所知,如果您嘗試設置列的外鍵,則效果最佳。

@Entity
@Table(name="test_details")
public class TestDetails implements Serializable {

    @Id
    //Generator
    @Column(name = "id", updatable = false, insertable = false)
    protected Long id;

    @Column(name="order_id_fk", updatable = false, insertable = false)
    private TestOrder orderId;
//getters and setters
}

暫無
暫無

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

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