阻止hibernate在@ManyToOne实体上触发更新查询

时间:2017-02-16 18:58:07

标签: spring hibernate spring-data-jpa

我有两个实体ProductCartItem和Product。我的场景中的产品更像是一个永远不会改变的主记录。下面是映射。

@Entity
@DiscriminatorValue(value = "PRODUCT")
public class ProductCartItem extends CartItem {

@ManyToOne(optional = false)
@JoinColumn(name = "product_id", referencedColumnName = "id")
private Product product;

@OneToMany(cascade = CascadeType.REMOVE, mappedBy = "parentProductCartItem",orphanRemoval = true)
@JsonManagedReference
Set<AccessoryCartItem> associatedAccessories = new HashSet<>();

@Column(name="property")
@Type(type = "ProductItemPropertyUserType")
private ProductItemProperty productItemProperty;

@OneToOne
@JoinColumn(name="project_id",referencedColumnName = "id")
private Project project;

public Product getProduct() {
    return product;
}

public void setProduct(Product product) {
    this.product = product;
}

public Set<AccessoryCartItem> getAssociatedAccessories() {
    return associatedAccessories;
}

public void setAssociatedAccessories(Set<AccessoryCartItem> associatedAccessories) {
    this.associatedAccessories = associatedAccessories;
}

public void addAccessory(AccessoryCartItem accessoryCartItem) {
    this.getAssociatedAccessories().add(accessoryCartItem);
}

public void removeAccessory(AccessoryCartItem accessoryCartItem) {
    this.getAssociatedAccessories().remove(accessoryCartItem);
}

public ProductItemProperty getProductItemProperty() {
    return productItemProperty;
}

public void setProductItemProperty(ProductItemProperty productItemProperty) {
    this.productItemProperty = productItemProperty;
}

public Project getProject() {
    return project;
}

public void setProject(Project project) {
    this.project = project;
}
}

这是产品实体。

 @Entity
 public class Product extends BaseEntity {
 private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "title")
    private String title;

    @Column(name = "subtitle")
    private String subtitle;

    @Column(name = "description")
    private String description;

    @Column(name = "type_name")
    private String typeName;

    @Column(name = "price")
    private Float price;

    @Column(name = "image_list")
    @Type(type = "MyImageListUserType")
    private MyImageList imageList;

    @Column(name = "pricing_property")
    @Type(type = "PricingProperty")
    private Map<String,SizePriceDTO> pricingProperty;

    @JoinColumn(name = "product_type")
    @ManyToOne
    private ProductType productType;

    private String orientation;

    private Short groupId;

    @Column(name = "display_order")
    private Short displayOrder;

    @Column(name = "base_quantity")
    private int baseQuantity;

    @Transient
    private List<AccessoryDTO> configuredAccessoryDTOList;

    public Product(){
    }


    public int getBaseQuantity() {
        return baseQuantity;
    }

    public void setBaseQuantity(int baseQuantity) {
        this.baseQuantity = baseQuantity;
    }

    public Integer getId() {
            return id;
        }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSubtitle() {
        return subtitle;
    }

    public void setSubtitle(String subtitle) {
        this.subtitle = subtitle;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getTypeName() {
        return typeName;
    }


    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public MyImageList getImageList() {
        return imageList;
    }

    public void setImageList(MyImageList imageList) {
        this.imageList = imageList;
    }

    public ProductType getProductType() {
        return productType;
    }

    public void setProductType(ProductType productType) {
        this.productType = productType;
    }
    public String getOrientation() {
        return orientation;
    }

    public void setOrientation(String orientation) {
        this.orientation = orientation;
    }

    public Short getGroupId() {
        return groupId;
    }


    public void setGroupId(Short groupId) {
        this.groupId = groupId;
    }


    public Short getDisplayOrder() {
        return displayOrder;
    }


    public void setDisplayOrder(Short displayOrder) {
        this.displayOrder = displayOrder;
    }

public List<AccessoryDTO> getConfiguredAccessoryDTOList() {
    return configuredAccessoryDTOList;
}

public void setConfiguredAccessoryDTOList(List<AccessoryDTO> configuredAccessoryDTOList) {
    this.configuredAccessoryDTOList = configuredAccessoryDTOList;
}

public Map<String, SizePriceDTO> getPricingProperty() {
    return pricingProperty;
}

public void setPricingProperty(Map<String,SizePriceDTO> pricingProperty) {
    this.pricingProperty = pricingProperty;
}
}

现在,当我创建一个新的ProductCartItem时,我将现有的Product与它相关联。当我因为某些原因保存productcartitem hibernate时,也会在产品表上触发更新查询。我已经尝试将关系设置为updatable = false但无效。以下是该服务的代码。

private ShoppingCart addProductToCartHelper(ProductCartItemDTO productCartItemDTO) throws ShoppingException{
    ShoppingCart shoppingCart;
    ProductCartItem productCartItem;
    Product product = productService.getProductById(productCartItemDTO.getProductDTO().getId().intValue());
    if (null == product) {
        throw new ShoppingException();
    }
    Customer currentCustomer = CanveraWebUtil.getCurrentCustomer();
    GuestUser guestUser = guestUserService.loadGuestUserByUUID(CanveraWebUtil.getCurrentGuestUserIdentifier());
    shoppingCart = fetchShoppingCartForCustomerOrGuestUser();
    if (null == shoppingCart) {
        if (null != currentCustomer) {
            shoppingCart = new ShoppingCart(currentCustomer);
        } else {
            shoppingCart = new ShoppingCart(guestUser);
        }
        shoppingCart.setShoppingBagStatus(ShoppingBagStatus.DRAFT);
    }
    Long productCartItemDTOId = productCartItemDTO.getId();
    // we will not update the associated accessories as in our case these never comes from our UI.
    if (null == productCartItemDTOId) {
        modifyNumberOfPages(productCartItemDTO,product);
        productCartItem = new ProductCartItem();
        productCartItem.setProductItemProperty(productCartItemDTO.getProductItemProperty());
        productCartItem.setQuantity(productCartItemDTO.getQuantity());
        productCartItem.setProduct(product);
        productCartItem.setPrice(productCartItemDTO.getPrice());
        productCartItem.setGiftWrap(shoppingCart.getIsGiftWrap());
        //associating project
        productCartItem.setProject(productCartItemDTO.getProject());

        shoppingCart.addCartItem(productCartItem);
        productCartItem.setShoppingCart(shoppingCart);
    } else {
        for (CartItem cartItem : shoppingCart.getCartItems()) {
            if (null != cartItem.getId() && cartItem.getId().equals(productCartItemDTOId)) {
                productCartItem  = (ProductCartItem) cartItem;
                productCartItem.setProductItemProperty(productCartItemDTO.getProductItemProperty());
                productCartItem.setPrice(productCartItemDTO.getPrice());
                productCartItem.setQuantity(productCartItemDTO.getQuantity());
            }
        }
    }
    shoppingCart = shoppingCartRepository.save(shoppingCart);
    return shoppingCart;
}

有人能指出我正确的方向吗?在任何时候我都不会改变产品对象的任何属性。

0 个答案:

没有答案