簡體   English   中英

JAVA + Hibernate:ORA-01407更新時不為空值

[英]JAVA + Hibernate: ORA-01407 when updating not null value

這是我的OrderNames pojo類映射:

...

<cache usage="transactional"/>

<id name="id" type="java.lang.Long">
    <column name="ID" precision="19" scale="0" />
    <generator class="sequence">
        <param name="sequence_name">MY_SEQ</param>
    </generator>
</id>

<property name="orderId" type="java.lang.Long">
    <column name="ORDER_ID" precision="19" scale="0" not-null="true"/>
</property>

<property name="userId" type="java.lang.Long">
    <column name="USER_ID" precision="19" scale="0" not-null="true"/>
</property>

<property name="orderName" type="java.lang.String">
    <column name="ORDER_NAME" length="35" not-null="true"/>
</property>

...

這是我的pojo課程:

public class OrderNamesModel {

    private Long id;
    private Long orderId;
    private Long userId;
    private String orderName;

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getOrderId() {
        return orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

而我的代碼:

public void changeOrderName(Long orderId, Long userId, String orderName) {
    OrderModel orderModel = getOrderModelForUpdate(orderId, userId, orderName);
    ordersDAO.saveOrder(orderModel);
}

private OrderModel getOrderModelForUpdate(Long orderId, Long userId, String orderName){
    OrderModel orderModel = ordersDAO.get(orderId);
    OrderNamesModel orderNameModel = ordersDAO.getByIdAndUserId(orderId, userId);
    orderName = StringUtils.trimToEmpty(orderName);
    if(StringUtils.isBlank(orderName)){
        orderModel.setOrderNames(null);
    }
    else{
        if(orderNameModel == null){
            orderNameModel = new OrderNamesModel();
            orderNameModel.setOrderId(orderModel.getOrderId());
            orderNameModel.setUserId(userId);
        }
        orderNameModel.setOrderName(orderName);
        orderModel.setOrderNames(new HashSet<>(Collections.singletonList(orderNameModel)));
    }

    return orderModel;
}

在使用orderName =“ New order Name”啟動它之后,我從數據庫獲取了現有行,並且在執行保存時發生了異常:

由以下原因引起:java.sql.SQLException:ORA-01407:無法更新(“ MY_DB”。“ ORDER_NAMES”。“ ORDER_ID”)為NULL

在調試模式下,在OrderNamesModel中將orderId的值設置為123

什么會引起這種奇怪的問題?

您具有此屬性:

 <property name="orderName" type="java.lang.String"> <column name="ORDER_NAME" length="35" not-null="true"/> </property> 

它指出ORDER_NAMENOT NULL (我假設它直接映射到基礎表的NOT NULL約束。

然后在您的getOrderModelForUpdate函數中,執行以下操作:

 orderModel.setOrderNames(null); 

在給定函數名稱的情況下,然后使用它執行更新並嘗試將NOT NULL屬性設置為NULL並獲取錯誤

由以下原因引起:java.sql.SQLException:ORA-01407:無法更新(“ MY_DB”。“ ORDER_NAMES”。“ ORDER_ID”)為NULL

當您嘗試將NOT NULL列設置為具有NULL值時,這似乎是一個完全適當的錯誤。

如果您應該在列中具有NULL值(並且空字符串與Oracle中的NULL相同),則需要在表上刪除NOT NULL約束。 相反,如果表約束正確,則不能將值設置為NULL而應選擇另一個值。

暫無
暫無

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

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