Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠:会话.更新()不工作_Java_Mysql_Hibernate - Fatal编程技术网

Java 休眠:会话.更新()不工作

Java 休眠:会话.更新()不工作,java,mysql,hibernate,Java,Mysql,Hibernate,我正在做一个Hibernate+Spring+MYSQL项目。我在尝试更新子表(外键表)时遇到问题 我可以插入和删除条目,但无法更新。我尝试了很多方法,但都不管用 PurchaseOrder上的CRUD操作,即父表工作正常 我已经从hibernate复仇文件xml创建了实体 PurchaseOrder到PurchaseOrderDetail具有一对多关系。 我的实体是 tpourchaseorder.java @Entity @Table(name = "tpurchase_order", c

我正在做一个Hibernate+Spring+MYSQL项目。我在尝试更新子表(外键表)时遇到问题 我可以插入和删除条目,但无法更新。我尝试了很多方法,但都不管用

PurchaseOrder上的CRUD操作,即父表工作正常

我已经从hibernate复仇文件xml创建了实体

PurchaseOrder
PurchaseOrderDetail
具有一对多关系。

我的实体是

tpourchaseorder.java

@Entity
@Table(name = "tpurchase_order", catalog = "peonydb")
public class TpurchaseOrder implements java.io.Serializable {

private long purchaseId;
private long VId;
private float purchaseAmount;
private Date paymentDueDate;
private float vat;
private boolean purchaseApproval;
private Set<TpurchaseOrderDetail> tpurchaseOrderDetails = new HashSet<TpurchaseOrderDetail>(0);

public TpurchaseOrder() {
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval, Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}

@Id

@Column(name = "PURCHASE_ID", unique = true, nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "V_ID", nullable = false)
public long getVId() {
    return this.VId;
}

public void setVId(long VId) {
    this.VId = VId;
}

@Column(name = "PURCHASE_AMOUNT", nullable = false, precision = 12, scale = 0)
public float getPurchaseAmount() {
    return this.purchaseAmount;
}

public void setPurchaseAmount(float purchaseAmount) {
    this.purchaseAmount = purchaseAmount;
}

@Temporal(TemporalType.DATE)
@Column(name = "PAYMENT_DUE_DATE", nullable = false, length = 0)
public Date getPaymentDueDate() {
    return this.paymentDueDate;
}

public void setPaymentDueDate(Date paymentDueDate) {
    this.paymentDueDate = paymentDueDate;
}

@Column(name = "VAT", nullable = false, precision = 12, scale = 0)
public float getVat() {
    return this.vat;
}

public void setVat(float vat) {
    this.vat = vat;
}

@Column(name = "PURCHASE_APPROVAL", nullable = false)
public boolean isPurchaseApproval() {
    return this.purchaseApproval;
}

public void setPurchaseApproval(boolean purchaseApproval) {
    this.purchaseApproval = purchaseApproval;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "tpurchaseOrder")
public Set<TpurchaseOrderDetail> getTpurchaseOrderDetails() {
    return this.tpurchaseOrderDetails;
}

public void setTpurchaseOrderDetails(Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}
@Entity
@Table(name = "tpurchase_order_detail", catalog = "peonydb",     uniqueConstraints = @UniqueConstraint(columnNames = {
    "PURCHASE_ID", "PROD_ID" }) )
public class TpurchaseOrderDetail implements java.io.Serializable {

private TpurchaseOrderDetailId id;
private TpurchaseOrder tpurchaseOrder;

public TpurchaseOrderDetail() {
}

public TpurchaseOrderDetail(TpurchaseOrderDetailId id, TpurchaseOrder tpurchaseOrder) {
    this.id = id;
    this.tpurchaseOrder = tpurchaseOrder;
}

@EmbeddedId

@AttributeOverrides({
        @AttributeOverride(name = "purchaseId", column = @Column(name = "PURCHASE_ID", nullable = false) ),
        @AttributeOverride(name = "prodId", column = @Column(name = "PROD_ID", nullable = false) ),
        @AttributeOverride(name = "prodQuantity", column = @Column(name = "PROD_QUANTITY", nullable = false) ),
        @AttributeOverride(name = "prodUnitRate", column = @Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0) ) })
public TpurchaseOrderDetailId getId() {
    return this.id;
}

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PURCHASE_ID", nullable = false, insertable = false, updatable = false)
public TpurchaseOrder getTpurchaseOrder() {
    return this.tpurchaseOrder;
}

public void setTpurchaseOrder(TpurchaseOrder tpurchaseOrder) {
    this.tpurchaseOrder = tpurchaseOrder;
}

}
@Embeddable
public class TpurchaseOrderDetailId implements java.io.Serializable {

private long purchaseId;
private long prodId;
private long prodQuantity;
private float prodUnitRate;

public TpurchaseOrderDetailId() {
}

public TpurchaseOrderDetailId(long purchaseId, long prodId, long prodQuantity, float prodUnitRate) {
    this.purchaseId = purchaseId;
    this.prodId = prodId;
    this.prodQuantity = prodQuantity;
    this.prodUnitRate = prodUnitRate;
}

@Column(name = "PURCHASE_ID", nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "PROD_ID", nullable = false)
public long getProdId() {
    return this.prodId;
}

public void setProdId(long prodId) {
    this.prodId = prodId;
}

@Column(name = "PROD_QUANTITY", nullable = false)
public long getProdQuantity() {
    return this.prodQuantity;
}

public void setProdQuantity(long prodQuantity) {
    this.prodQuantity = prodQuantity;
}

@Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0)
public float getProdUnitRate() {
    return this.prodUnitRate;
}

public void setProdUnitRate(float prodUnitRate) {
    this.prodUnitRate = prodUnitRate;
}

public boolean equals(Object other) {
    if ((this == other))
        return true;
    if ((other == null))
        return false;
    if (!(other instanceof TpurchaseOrderDetailId))
        return false;
    TpurchaseOrderDetailId castOther = (TpurchaseOrderDetailId) other;

    return (this.getPurchaseId() == castOther.getPurchaseId()) && (this.getProdId() == castOther.getProdId())
            && (this.getProdQuantity() == castOther.getProdQuantity())
            && (this.getProdUnitRate() == castOther.getProdUnitRate());
}

public int hashCode() {
    int result = 17;

    result = 37 * result + (int) this.getPurchaseId();
    result = 37 * result + (int) this.getProdId();
    result = 37 * result + (int) this.getProdQuantity();
    result = 37 * result + (int) this.getProdUnitRate();
    return result;
}

}
public class TpurchaseOrderDetailId {
  private long purchaseId;
  private long prodId;
}
public class TpurchaseOrderDetail {
  private TpurchaseOrderDetailId id;
  private TpurchaseOrder tpurchaseOrder;
  private long prodQuantity;
  private float prodUnitRate;
}
tpourchaseOrderDetail.java

@Entity
@Table(name = "tpurchase_order", catalog = "peonydb")
public class TpurchaseOrder implements java.io.Serializable {

private long purchaseId;
private long VId;
private float purchaseAmount;
private Date paymentDueDate;
private float vat;
private boolean purchaseApproval;
private Set<TpurchaseOrderDetail> tpurchaseOrderDetails = new HashSet<TpurchaseOrderDetail>(0);

public TpurchaseOrder() {
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval, Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}

@Id

@Column(name = "PURCHASE_ID", unique = true, nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "V_ID", nullable = false)
public long getVId() {
    return this.VId;
}

public void setVId(long VId) {
    this.VId = VId;
}

@Column(name = "PURCHASE_AMOUNT", nullable = false, precision = 12, scale = 0)
public float getPurchaseAmount() {
    return this.purchaseAmount;
}

public void setPurchaseAmount(float purchaseAmount) {
    this.purchaseAmount = purchaseAmount;
}

@Temporal(TemporalType.DATE)
@Column(name = "PAYMENT_DUE_DATE", nullable = false, length = 0)
public Date getPaymentDueDate() {
    return this.paymentDueDate;
}

public void setPaymentDueDate(Date paymentDueDate) {
    this.paymentDueDate = paymentDueDate;
}

@Column(name = "VAT", nullable = false, precision = 12, scale = 0)
public float getVat() {
    return this.vat;
}

public void setVat(float vat) {
    this.vat = vat;
}

@Column(name = "PURCHASE_APPROVAL", nullable = false)
public boolean isPurchaseApproval() {
    return this.purchaseApproval;
}

public void setPurchaseApproval(boolean purchaseApproval) {
    this.purchaseApproval = purchaseApproval;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "tpurchaseOrder")
public Set<TpurchaseOrderDetail> getTpurchaseOrderDetails() {
    return this.tpurchaseOrderDetails;
}

public void setTpurchaseOrderDetails(Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}
@Entity
@Table(name = "tpurchase_order_detail", catalog = "peonydb",     uniqueConstraints = @UniqueConstraint(columnNames = {
    "PURCHASE_ID", "PROD_ID" }) )
public class TpurchaseOrderDetail implements java.io.Serializable {

private TpurchaseOrderDetailId id;
private TpurchaseOrder tpurchaseOrder;

public TpurchaseOrderDetail() {
}

public TpurchaseOrderDetail(TpurchaseOrderDetailId id, TpurchaseOrder tpurchaseOrder) {
    this.id = id;
    this.tpurchaseOrder = tpurchaseOrder;
}

@EmbeddedId

@AttributeOverrides({
        @AttributeOverride(name = "purchaseId", column = @Column(name = "PURCHASE_ID", nullable = false) ),
        @AttributeOverride(name = "prodId", column = @Column(name = "PROD_ID", nullable = false) ),
        @AttributeOverride(name = "prodQuantity", column = @Column(name = "PROD_QUANTITY", nullable = false) ),
        @AttributeOverride(name = "prodUnitRate", column = @Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0) ) })
public TpurchaseOrderDetailId getId() {
    return this.id;
}

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PURCHASE_ID", nullable = false, insertable = false, updatable = false)
public TpurchaseOrder getTpurchaseOrder() {
    return this.tpurchaseOrder;
}

public void setTpurchaseOrder(TpurchaseOrder tpurchaseOrder) {
    this.tpurchaseOrder = tpurchaseOrder;
}

}
@Embeddable
public class TpurchaseOrderDetailId implements java.io.Serializable {

private long purchaseId;
private long prodId;
private long prodQuantity;
private float prodUnitRate;

public TpurchaseOrderDetailId() {
}

public TpurchaseOrderDetailId(long purchaseId, long prodId, long prodQuantity, float prodUnitRate) {
    this.purchaseId = purchaseId;
    this.prodId = prodId;
    this.prodQuantity = prodQuantity;
    this.prodUnitRate = prodUnitRate;
}

@Column(name = "PURCHASE_ID", nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "PROD_ID", nullable = false)
public long getProdId() {
    return this.prodId;
}

public void setProdId(long prodId) {
    this.prodId = prodId;
}

@Column(name = "PROD_QUANTITY", nullable = false)
public long getProdQuantity() {
    return this.prodQuantity;
}

public void setProdQuantity(long prodQuantity) {
    this.prodQuantity = prodQuantity;
}

@Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0)
public float getProdUnitRate() {
    return this.prodUnitRate;
}

public void setProdUnitRate(float prodUnitRate) {
    this.prodUnitRate = prodUnitRate;
}

public boolean equals(Object other) {
    if ((this == other))
        return true;
    if ((other == null))
        return false;
    if (!(other instanceof TpurchaseOrderDetailId))
        return false;
    TpurchaseOrderDetailId castOther = (TpurchaseOrderDetailId) other;

    return (this.getPurchaseId() == castOther.getPurchaseId()) && (this.getProdId() == castOther.getProdId())
            && (this.getProdQuantity() == castOther.getProdQuantity())
            && (this.getProdUnitRate() == castOther.getProdUnitRate());
}

public int hashCode() {
    int result = 17;

    result = 37 * result + (int) this.getPurchaseId();
    result = 37 * result + (int) this.getProdId();
    result = 37 * result + (int) this.getProdQuantity();
    result = 37 * result + (int) this.getProdUnitRate();
    return result;
}

}
public class TpurchaseOrderDetailId {
  private long purchaseId;
  private long prodId;
}
public class TpurchaseOrderDetail {
  private TpurchaseOrderDetailId id;
  private TpurchaseOrder tpurchaseOrder;
  private long prodQuantity;
  private float prodUnitRate;
}
更新代码方法:

@Transactional
@Override
public String updatePO(PurchaseOrderPojo purchaseOrderPojo,
        ArrayList<PurchaseOrderDetailIdPojo> updatedPurchasedProductsList, String purchaseId) {
    final Transaction transaction;
    try {
        if (this.session != null && !this.session.isConnected()) {
            this.session = this.sessionFactory.openSession();
        } else {
            this.session = this.sessionFactory.getCurrentSession();
        }
        transaction = session.beginTransaction();

        TpurchaseOrder tpurchaseOrder = (TpurchaseOrder) session.get(TpurchaseOrder.class,
                Long.parseLong(purchaseId));

        List<TpurchaseOrderDetail> tpurchaseOrderDetailListFromDB = null;
        if (purchaseOrderPojo != null) {
            tpurchaseOrder.setVId(purchaseOrderPojo.getVId());
            tpurchaseOrder.setVat(purchaseOrderPojo.getVat());
            // to be set later on once the PO is approved
            tpurchaseOrder.setPurchaseApproval(false);
            tpurchaseOrder.setPaymentDueDate(DateUtils.StringtoUtilDate(purchaseOrderPojo.getPaymentDueDate()));
            tpurchaseOrder.setPurchaseAmount(getPurchaseAmount(purchaseOrderPojo, updatedPurchasedProductsList));
            session.update(tpurchaseOrder); // THIS WORKS FINE I CAN SEE UPDATE QUERY ON CONSOLE FOR THIS PARENT TABLE

            Criteria criteria = session.createCriteria(TpurchaseOrderDetail.class);
            criteria.add(Restrictions.eq("id.purchaseId", Long.parseLong(purchaseId)));
            tpurchaseOrderDetailListFromDB = criteria.list();

            for (PurchaseOrderDetailIdPojo purchaseOrderDetailIdUpdatedObj : updatedPurchasedProductsList) {
                isObjectPresent = false;
                for (TpurchaseOrderDetail tpurchaseOrderDetailObjFromDB : tpurchaseOrderDetailListFromDB) {
                    // if the purchase product is already present in the DB
                    // then update it

                    if (tpurchaseOrderDetailObjFromDB.getId().getProdId() == purchaseOrderDetailIdUpdatedObj
                            .getProdId()) {
                        TpurchaseOrderDetailId tpurchaseOrderDetailId = tpurchaseOrderDetailObjFromDB.getId();
                        tpurchaseOrderDetailId.setProdQuantity(purchaseOrderDetailIdUpdatedObj.getProdQuantity());                          
                        tpurchaseOrderDetailId.setProdUnitRate(purchaseOrderDetailIdUpdatedObj.getProdUnitRate());
                        tpurchaseOrderDetailObjFromDB.setId(tpurchaseOrderDetailId);

                        session.update(tpurchaseOrderDetailObjFromDB); // THIS IS NOT WORKING, I EVEN TRIED USING saveOrUpdate METHOD
                        session.flush();                            
                    }                       
                }
            }
        }
        transaction.commit();
        return StringConstants.SUCCESS_STR;
    } catch (Exception exception) {
        // rollback procedure to be implemented
        exception.printStackTrace();
        return exception.getMessage();
    }
}
@Transactional
@凌驾
公共字符串updatePO(PurchaseOrderPojo PurchaseOrderPojo,
ArrayList updatedPurchasedProductsList,字符串purchaseId){
最终交易;
试一试{
if(this.session!=null&&!this.session.isConnected()){
this.session=this.sessionFactory.openSession();
}否则{
this.session=this.sessionFactory.getCurrentSession();
}
事务=session.beginTransaction();
TpurchaseOrder TpurchaseOrder=(TpurchaseOrder)会话.get(TpurchaseOrder.class,
Long.parseLong(purchaseId));
List tpourchaseOrderDetailListFromDB=null;
if(purchaseOrderPojo!=null){
tpurchaseOrder.setVId(purchaseOrderPojo.getVId());
tpurchaseOrder.setVat(purchaseOrderPojo.getVat());
//待采购订单批准后再设置
tpourchaseOrder.setPurchaseApproval(false);
tpurchaseOrder.setPaymentDueDate(DateUtils.StringtoUtilDate(purchaseOrderPojo.getPaymentDueDate());
tpurchaseOrder.setPurchaseAmount(getPurchaseAmount(purchaseOrderPojo,UpdatedPurchasedProductList));
session.update(tpurchaseOrder);//这很好,我可以在控制台上看到此父表的更新查询
Criteria=session.createCriteria(TpurchaseOrderDetail.class);
添加(Restrictions.eq(“id.purchaseId”,Long.parseLong(purchaseId));
tpourchaseOrderDetailListFromDB=criteria.list();
for(PurchaseOrderDetailIdPojo purchaseOrderDetailIdUpdatedObj:UpdatedPurchasedProductList){
isObjectPresent=假;
对于(TPURCHASEORDETAIL TPURCHASEORDETAILOBJFROMDB:TPURCHASEORDETAILLISTFORMDB){
//如果采购产品已存在于数据库中
//然后更新它
如果(TPURCCHASEORDETAILOBJFROMDB.getId().getProdId()==PURCHASEORDEDETAILIDUPDATEDOBJ
.getProdId()){
TPURCHASEORDETAILD TPURCHASEORDETAILD=TPURCHASEORDETAILOBJFROMDB.getId();
tpourchaseOrderDetailId.setProdQuantity(purchaseOrderDetailIdUpdateDB.getProdQuantity());
tpourchaseOrderDetailId.setProdUnitRate(purchaseOrderDetailIdUpdatedObj.getProdUnitRate());
TPURCCHASEORDETAILOBJFROMDB.setId(TPURCCHASEORDETAILD);
update(TPURCHASEORDETAILOBJFROMDB);//这不起作用,我甚至尝试使用saveOrUpdate方法
session.flush();
}                       
}
}
}
commit();
返回StringConstants.SUCCESS\u STR;
}捕获(异常){
//要执行的回滚过程
异常。printStackTrace();
返回异常。getMessage();
}
}

更新失败的原因是您试图更改记录的主键,这在关系数据库中是不允许的

我建议如下(为了简洁起见,删除注释/getter/setter)

tpourchaseOrderDetail.java

@Entity
@Table(name = "tpurchase_order", catalog = "peonydb")
public class TpurchaseOrder implements java.io.Serializable {

private long purchaseId;
private long VId;
private float purchaseAmount;
private Date paymentDueDate;
private float vat;
private boolean purchaseApproval;
private Set<TpurchaseOrderDetail> tpurchaseOrderDetails = new HashSet<TpurchaseOrderDetail>(0);

public TpurchaseOrder() {
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval, Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}

@Id

@Column(name = "PURCHASE_ID", unique = true, nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "V_ID", nullable = false)
public long getVId() {
    return this.VId;
}

public void setVId(long VId) {
    this.VId = VId;
}

@Column(name = "PURCHASE_AMOUNT", nullable = false, precision = 12, scale = 0)
public float getPurchaseAmount() {
    return this.purchaseAmount;
}

public void setPurchaseAmount(float purchaseAmount) {
    this.purchaseAmount = purchaseAmount;
}

@Temporal(TemporalType.DATE)
@Column(name = "PAYMENT_DUE_DATE", nullable = false, length = 0)
public Date getPaymentDueDate() {
    return this.paymentDueDate;
}

public void setPaymentDueDate(Date paymentDueDate) {
    this.paymentDueDate = paymentDueDate;
}

@Column(name = "VAT", nullable = false, precision = 12, scale = 0)
public float getVat() {
    return this.vat;
}

public void setVat(float vat) {
    this.vat = vat;
}

@Column(name = "PURCHASE_APPROVAL", nullable = false)
public boolean isPurchaseApproval() {
    return this.purchaseApproval;
}

public void setPurchaseApproval(boolean purchaseApproval) {
    this.purchaseApproval = purchaseApproval;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "tpurchaseOrder")
public Set<TpurchaseOrderDetail> getTpurchaseOrderDetails() {
    return this.tpurchaseOrderDetails;
}

public void setTpurchaseOrderDetails(Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}
@Entity
@Table(name = "tpurchase_order_detail", catalog = "peonydb",     uniqueConstraints = @UniqueConstraint(columnNames = {
    "PURCHASE_ID", "PROD_ID" }) )
public class TpurchaseOrderDetail implements java.io.Serializable {

private TpurchaseOrderDetailId id;
private TpurchaseOrder tpurchaseOrder;

public TpurchaseOrderDetail() {
}

public TpurchaseOrderDetail(TpurchaseOrderDetailId id, TpurchaseOrder tpurchaseOrder) {
    this.id = id;
    this.tpurchaseOrder = tpurchaseOrder;
}

@EmbeddedId

@AttributeOverrides({
        @AttributeOverride(name = "purchaseId", column = @Column(name = "PURCHASE_ID", nullable = false) ),
        @AttributeOverride(name = "prodId", column = @Column(name = "PROD_ID", nullable = false) ),
        @AttributeOverride(name = "prodQuantity", column = @Column(name = "PROD_QUANTITY", nullable = false) ),
        @AttributeOverride(name = "prodUnitRate", column = @Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0) ) })
public TpurchaseOrderDetailId getId() {
    return this.id;
}

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PURCHASE_ID", nullable = false, insertable = false, updatable = false)
public TpurchaseOrder getTpurchaseOrder() {
    return this.tpurchaseOrder;
}

public void setTpurchaseOrder(TpurchaseOrder tpurchaseOrder) {
    this.tpurchaseOrder = tpurchaseOrder;
}

}
@Embeddable
public class TpurchaseOrderDetailId implements java.io.Serializable {

private long purchaseId;
private long prodId;
private long prodQuantity;
private float prodUnitRate;

public TpurchaseOrderDetailId() {
}

public TpurchaseOrderDetailId(long purchaseId, long prodId, long prodQuantity, float prodUnitRate) {
    this.purchaseId = purchaseId;
    this.prodId = prodId;
    this.prodQuantity = prodQuantity;
    this.prodUnitRate = prodUnitRate;
}

@Column(name = "PURCHASE_ID", nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "PROD_ID", nullable = false)
public long getProdId() {
    return this.prodId;
}

public void setProdId(long prodId) {
    this.prodId = prodId;
}

@Column(name = "PROD_QUANTITY", nullable = false)
public long getProdQuantity() {
    return this.prodQuantity;
}

public void setProdQuantity(long prodQuantity) {
    this.prodQuantity = prodQuantity;
}

@Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0)
public float getProdUnitRate() {
    return this.prodUnitRate;
}

public void setProdUnitRate(float prodUnitRate) {
    this.prodUnitRate = prodUnitRate;
}

public boolean equals(Object other) {
    if ((this == other))
        return true;
    if ((other == null))
        return false;
    if (!(other instanceof TpurchaseOrderDetailId))
        return false;
    TpurchaseOrderDetailId castOther = (TpurchaseOrderDetailId) other;

    return (this.getPurchaseId() == castOther.getPurchaseId()) && (this.getProdId() == castOther.getProdId())
            && (this.getProdQuantity() == castOther.getProdQuantity())
            && (this.getProdUnitRate() == castOther.getProdUnitRate());
}

public int hashCode() {
    int result = 17;

    result = 37 * result + (int) this.getPurchaseId();
    result = 37 * result + (int) this.getProdId();
    result = 37 * result + (int) this.getProdQuantity();
    result = 37 * result + (int) this.getProdUnitRate();
    return result;
}

}
public class TpurchaseOrderDetailId {
  private long purchaseId;
  private long prodId;
}
public class TpurchaseOrderDetail {
  private TpurchaseOrderDetailId id;
  private TpurchaseOrder tpurchaseOrder;
  private long prodQuantity;
  private float prodUnitRate;
}
tpourchaseOrderDetail.java

@Entity
@Table(name = "tpurchase_order", catalog = "peonydb")
public class TpurchaseOrder implements java.io.Serializable {

private long purchaseId;
private long VId;
private float purchaseAmount;
private Date paymentDueDate;
private float vat;
private boolean purchaseApproval;
private Set<TpurchaseOrderDetail> tpurchaseOrderDetails = new HashSet<TpurchaseOrderDetail>(0);

public TpurchaseOrder() {
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
}

public TpurchaseOrder(long purchaseId, long VId, float purchaseAmount, Date paymentDueDate, float vat,
        boolean purchaseApproval, Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.purchaseId = purchaseId;
    this.VId = VId;
    this.purchaseAmount = purchaseAmount;
    this.paymentDueDate = paymentDueDate;
    this.vat = vat;
    this.purchaseApproval = purchaseApproval;
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}

@Id

@Column(name = "PURCHASE_ID", unique = true, nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "V_ID", nullable = false)
public long getVId() {
    return this.VId;
}

public void setVId(long VId) {
    this.VId = VId;
}

@Column(name = "PURCHASE_AMOUNT", nullable = false, precision = 12, scale = 0)
public float getPurchaseAmount() {
    return this.purchaseAmount;
}

public void setPurchaseAmount(float purchaseAmount) {
    this.purchaseAmount = purchaseAmount;
}

@Temporal(TemporalType.DATE)
@Column(name = "PAYMENT_DUE_DATE", nullable = false, length = 0)
public Date getPaymentDueDate() {
    return this.paymentDueDate;
}

public void setPaymentDueDate(Date paymentDueDate) {
    this.paymentDueDate = paymentDueDate;
}

@Column(name = "VAT", nullable = false, precision = 12, scale = 0)
public float getVat() {
    return this.vat;
}

public void setVat(float vat) {
    this.vat = vat;
}

@Column(name = "PURCHASE_APPROVAL", nullable = false)
public boolean isPurchaseApproval() {
    return this.purchaseApproval;
}

public void setPurchaseApproval(boolean purchaseApproval) {
    this.purchaseApproval = purchaseApproval;
}

@OneToMany(fetch = FetchType.LAZY, mappedBy = "tpurchaseOrder")
public Set<TpurchaseOrderDetail> getTpurchaseOrderDetails() {
    return this.tpurchaseOrderDetails;
}

public void setTpurchaseOrderDetails(Set<TpurchaseOrderDetail> tpurchaseOrderDetails) {
    this.tpurchaseOrderDetails = tpurchaseOrderDetails;
}
@Entity
@Table(name = "tpurchase_order_detail", catalog = "peonydb",     uniqueConstraints = @UniqueConstraint(columnNames = {
    "PURCHASE_ID", "PROD_ID" }) )
public class TpurchaseOrderDetail implements java.io.Serializable {

private TpurchaseOrderDetailId id;
private TpurchaseOrder tpurchaseOrder;

public TpurchaseOrderDetail() {
}

public TpurchaseOrderDetail(TpurchaseOrderDetailId id, TpurchaseOrder tpurchaseOrder) {
    this.id = id;
    this.tpurchaseOrder = tpurchaseOrder;
}

@EmbeddedId

@AttributeOverrides({
        @AttributeOverride(name = "purchaseId", column = @Column(name = "PURCHASE_ID", nullable = false) ),
        @AttributeOverride(name = "prodId", column = @Column(name = "PROD_ID", nullable = false) ),
        @AttributeOverride(name = "prodQuantity", column = @Column(name = "PROD_QUANTITY", nullable = false) ),
        @AttributeOverride(name = "prodUnitRate", column = @Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0) ) })
public TpurchaseOrderDetailId getId() {
    return this.id;
}

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PURCHASE_ID", nullable = false, insertable = false, updatable = false)
public TpurchaseOrder getTpurchaseOrder() {
    return this.tpurchaseOrder;
}

public void setTpurchaseOrder(TpurchaseOrder tpurchaseOrder) {
    this.tpurchaseOrder = tpurchaseOrder;
}

}
@Embeddable
public class TpurchaseOrderDetailId implements java.io.Serializable {

private long purchaseId;
private long prodId;
private long prodQuantity;
private float prodUnitRate;

public TpurchaseOrderDetailId() {
}

public TpurchaseOrderDetailId(long purchaseId, long prodId, long prodQuantity, float prodUnitRate) {
    this.purchaseId = purchaseId;
    this.prodId = prodId;
    this.prodQuantity = prodQuantity;
    this.prodUnitRate = prodUnitRate;
}

@Column(name = "PURCHASE_ID", nullable = false)
public long getPurchaseId() {
    return this.purchaseId;
}

public void setPurchaseId(long purchaseId) {
    this.purchaseId = purchaseId;
}

@Column(name = "PROD_ID", nullable = false)
public long getProdId() {
    return this.prodId;
}

public void setProdId(long prodId) {
    this.prodId = prodId;
}

@Column(name = "PROD_QUANTITY", nullable = false)
public long getProdQuantity() {
    return this.prodQuantity;
}

public void setProdQuantity(long prodQuantity) {
    this.prodQuantity = prodQuantity;
}

@Column(name = "PROD_UNIT_RATE", nullable = false, precision = 12, scale = 0)
public float getProdUnitRate() {
    return this.prodUnitRate;
}

public void setProdUnitRate(float prodUnitRate) {
    this.prodUnitRate = prodUnitRate;
}

public boolean equals(Object other) {
    if ((this == other))
        return true;
    if ((other == null))
        return false;
    if (!(other instanceof TpurchaseOrderDetailId))
        return false;
    TpurchaseOrderDetailId castOther = (TpurchaseOrderDetailId) other;

    return (this.getPurchaseId() == castOther.getPurchaseId()) && (this.getProdId() == castOther.getProdId())
            && (this.getProdQuantity() == castOther.getProdQuantity())
            && (this.getProdUnitRate() == castOther.getProdUnitRate());
}

public int hashCode() {
    int result = 17;

    result = 37 * result + (int) this.getPurchaseId();
    result = 37 * result + (int) this.getProdId();
    result = 37 * result + (int) this.getProdQuantity();
    result = 37 * result + (int) this.getProdUnitRate();
    return result;
}

}
public class TpurchaseOrderDetailId {
  private long purchaseId;
  private long prodId;
}
public class TpurchaseOrderDetail {
  private TpurchaseOrderDetailId id;
  private TpurchaseOrder tpurchaseOrder;
  private long prodQuantity;
  private float prodUnitRate;
}

这将允许
prodQuantity
prodUnitRate
tpourchaseOrderDetail
行的整个生命周期内都发生更改,而您的原始代码没有这样做。

您提供了代码,这很好,但代码太多了!你能不能简化这个例子,同时再现这个问题?当你这样做的时候,你自己也可能会找到答案。另外,你能解释一下“不工作”是什么意思吗?你有错误吗?更新代码根本不运行吗?或者它运行时并没有实际执行更新?@devlin:感谢您的评论,我说的不工作是指没有在子表(即PurchaseOrderDetail表)上触发的更新查询。这些记录不会更新。在代码部分,我只提供了实体。:)如果你愿意,我会尽量减少。谢谢你的回答。你能告诉我我在哪里更改PK吗?我在更新记录时没有收到任何错误。问题是update命令本身并没有在行session.update(TPURCHASEORDETAILOBJFROMDB)上触发;