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