这是我的 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
什么可能导致这种奇怪的问题?
答案 0 :(得分:0)
你有这个属性:
<property name="orderName" type="java.lang.String"> <column name="ORDER_NAME" length="35" not-null="true"/> </property>
指出ORDER_NAME
是NOT 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
并且应该选择另一个值。