JAVA + Hibernate:更新非空值时的ORA-01407

时间:2017-10-04 07:59:41

标签: java oracle hibernate

这是我的 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 =&#34;新订单名称&#34;启动后,我从DB获取现有行,并在执行保存时发生异常:

  

引起:java.sql.SQLException:ORA-01407:无法更新   (&#34; MY_DB&#34;。&#34; ORDER_NAMES&#34;。&#34; ORDER_ID&#34;)为NULL

在调试模式下,orderId的值在OrderNamesModel中设置为123

什么可能导致这种奇怪的问题?

1 个答案:

答案 0 :(得分:0)

你有这个属性:

<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并且应该选择另一个值。