【问题标题】:saving hibernate entity with multiple objects of same type用多个相同类型的对象保存休眠实体
【发布时间】:2021-12-31 10:35:48
【问题描述】:

当我保存下面的实体时,它在另一个对象中复制了相同的值:

例如,从我的 struts 项目(屏幕)中,如果我更改字段 shipmentShipper 的值,那么 shipmentConsignee 也会更新为相同的值。

Struts 配置:

<struts>

<package name="orderManagement" namespace="/orderManagement" extends="struts-default">
    <action name="OrderManagementAction" class="com.logistics.actions.orderManagement.OrderManagementAction" method="executeOnLoad">
        <result name="success">/WEB-INF/pages/orderManagment/orderManagement.jsp</result>
        <result name="list">/WEB-INF/pages/orderManagment/orderManagementList.jsp</result>
        <result name="error">index.jsp</result>
    </action>
</package>

</struts>

动作类:

package com.logistics.actions.orderManagement;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.dsiksjane.actions.base.BaseAction;
import com.dsiksjane.actions.login.LoginCO;
import com.dsiksjane.beans.LoginBean;
import com.dsiksjane.beans.common.LookupBean;
import com.dsiksjane.common.CommonConstants;
import com.logistics.entities.customers.Customers;
import com.logistics.entities.orderManagement.Orders;
import com.logistics.service.customers.ICustomersService;
import com.logistics.service.orderManagement.IOrderManagementService;

import lombok.Getter;
import lombok.Setter;

/**
 * 
 * @author Sikandar Mahmood
 *
 */
@Component
@Getter
@Setter
public class OrderManagementAction extends BaseAction {

private OrderManagementCO orderManagementCO = new OrderManagementCO();

private List<LookupBean> orderTypeList = new ArrayList<LookupBean>();

private List<Customers> customersList = new ArrayList<Customers>();

private List<Customers> agentsList = new ArrayList<Customers>();

private List<Customers> portsList = new ArrayList<Customers>();

@Autowired
private IOrderManagementService service;

@Autowired
private ICustomersService customerService;

/**
 * On Load method
 * @return
 * @throws Exception 
 */
public String executeOnLoad() throws Exception {

    String actionCommand = (String) getRequestParameter("actionCommand") == null ? SUCCESS : (String) getRequestParameter("actionCommand");
    
    switch (actionCommand) {
    
    case SUCCESS:
        init();
        //orderManagementCO.setOrder(null);
        setPage(SUCCESS);
        break;
        
    case CLEAR:
        init();
        orderManagementCO.setOrder(null);
        setPage(SUCCESS);
        break;


    case EDIT_RECORD:
        init();
        Long id = Long.parseLong( (String) getRequestParameter("id") );
        Orders order = service.getOrder(id);
        orderManagementCO.setOrder(order);
        setPage(SUCCESS);
        break;
    
    case LIST:
        List<Orders> orders = service.getMainList();
        getRequest().setAttribute("objectList", orders );
        setPage(LIST);
        break;
    
    case SUBMIT:
        LoginCO loginCO = ((LoginCO) getSessionMap().get("loginCO"));
        LoginBean loggedInUser = loginCO.getUserBean();
        if( loggedInUser == null )
            return ERROR;
        
        service.save(orderManagementCO, loggedInUser);
        setPage(SUCCESS);
        break;

    default: // do nothing..

    }

    return getPage();

}


/**
 * This method fills the default values for the page being loaded... 
 * @throws Exception 
 */
public void fillDefaultValues() throws Exception {
    getDefaultValueOrderType();
}

public String getDefaultValueOrderType() throws Exception {
    String defaultOrderType = getBaseService().getDefaultLookupValue(CommonConstants.LOOKUP_TABLE_ORDER_TYPES);
    return defaultOrderType;
}

/**
 * Initialization of page
 * 
 * @throws Exception
 */
public void init() throws Exception {
    
    setOrderTypeList(getBaseService().getLookupByTable(CommonConstants.LOOKUP_TABLE_ORDER_TYPES));
    
    setCustomersList( getCustomerService().getMainList() );
    
    setAgentsList( getCustomerService().getAgentsList() );
    
    setPortsList( getCustomerService().getPortsList() );

    fillDefaultValues();
    
}

}

实体:

package com.logistics.entities.orderManagement;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import com.dsiksjane.beans.common.NecessaryFields;
import com.logistics.entities.customers.Customers;

import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name="orders") 
@Getter
@Setter
public class Orders extends NecessaryFields {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name="consignee_ntn")
    private String consigneeNtn;

    /**
     * Clearing Agent
     */
    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)   
    @JoinColumn(name="clearing_agent_name")
    private Customers clearingAgentName;

    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name="shipment_shipper")
    private Customers shipmentShipper;

    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name="shipment_consignee")
    private Customers shipmentConsignee;

    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name="shipment_notify_party")
    private Customers shipmentNotifyParty;

    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name="shipment_forwarder")
    private Customers shipmentForwarder;


    @Column(name="clearing_agent_challan")
    private String clearingAgentChallan;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "order_details_id", referencedColumnName = "id")
    private OrdersDetail orderDetails;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "order_address_id", referencedColumnName = "id")
    private OrdersAddress orderAddress;

}

存储库类:

@Service
public class OrderManagementService implements IOrderManagementService {

    @Autowired
    private IOrderManagementDAO dao;

    @Override
    public OrderManagementCO save(OrderManagementCO orderManagementCO, LoginBean loggedInUser) throws Exception {
    
        Orders obj = orderManagementCO.getOrder();
    
        if( obj.getId() != null ) {
            obj.setUpdatedBy(loggedInUser.getUserName());
            obj.setUpdatedDate( new java.util.Date() );
        } else {
            obj.setCreatedBy(loggedInUser.getUserName());
            obj.setCreatedDate( new java.util.Date() );
            obj.setCompanyId( loggedInUser.getCompanyId() );
        }
    
        dao.save( obj ); 
    
        return orderManagementCO;
    }
}

JSP 中的字段映射(工作正常):

<s:select id="selectShipper" class="custom-field"
name="orderManagementCO.order.shipmentShipper.id" 
label="Service Type" headerKey="-1" headerValue="Select Shipper" 
list="%{customersList}" listKey="id" listValue="fullName" />

<s:select id="selectConsignee" class="custom-field"
name="orderManagementCO.order.shipmentConsignee.id" 
label="Consignee" headerKey="-1" headerValue="Select Consignee" 
list="%{customersList}" listKey="id" listValue="fullName" />

请查看屏幕截图,我将托运人更改为 C4 并保存。收货人也被选为C4。请注意,两个选择都填充了相同的数据列表。 (客户名单)

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我认为,您应该在 &lt;s:select&gt; 标记中使用 value 属性,并且该属性应该具有您发送到后端的值。可能类似于value="%{orderManagementCO.order.shipmentShipper.id}",另一个应该是value="%{orderManagementCO.order.shipmentConsignee.id}"

    【讨论】:

    • 当我从前端发送时,网络选项卡中的数据正常,但在 struts 操作中它与请求中发送的不同。可能是从数据库中检索实体时,其中的子实体未正确获取,实体是否混淆以获取正确的实体?
    • 只是对OrderManagementCO结构感到好奇,能否请您也附上。
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多