Sql 无法在hibernate中更新一对一关系的对象
我的关系如下所示:Sql 无法在hibernate中更新一对一关系的对象,sql,spring,hibernate,Sql,Spring,Hibernate,我的关系如下所示: @Entity @Table(name = "ORDER_", catalog = "smartorder") public class Order implements Serializable { /** * serial version id */ private static final long serialVersionUID = 13875615L; @Id @Column(name = "ORDE
@Entity
@Table(name = "ORDER_", catalog = "smartorder")
public class Order implements Serializable {
/**
* serial version id
*/
private static final long serialVersionUID = 13875615L;
@Id
@Column(name = "ORDER_ID", unique = true, nullable = false)
@SequenceGenerator(name = "ORDER_ID_GEN", sequenceName = "ORDER_ID_SEQ")
@GeneratedValue(generator = "ORDER_ID_GEN")
private long orderId;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "INVOICE_ID", referencedColumnName = "INVOICE_ID")
private Invoice invoice;
// setters and getters
}
@Entity
@Table(name = "INVOICE_")
public class Invoice implements Serializable {
/**
* serial version id
*/
private static final long serialVersionUID = 13875612L;
@Id
@Column(name = "INVOICE_ID", unique = true, nullable = false)
@SequenceGenerator(name = "INVOICE_ID_GEN", sequenceName = "INVOICE_ID_SEQ")
@GeneratedValue(generator = "INVOICE_ID_GEN")
private int invoiceId;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "ORDER_ID", referencedColumnName = "ORDER_ID")
private Order order;
@Column(name = "SUB_TOTAL", precision = 6, nullable = false)
private double subTotal;
@Column(name = "SERVICE_TAX", precision = 6, nullable = false)
private double serviceTax;
@Column(name = "VAT", precision = 6, nullable = false)
private double vat;
@Column(name = "SURCHAARGE", precision = 6, nullable = false)
private double surChaarge;
@Column(name = "GRAND_TOTAL", precision = 6, nullable = false)
private double grandTotal;
//setters and getters
}
我能够正确地保存记录。但是,当我试图通过将invoice对象设置为order对象来更新orders对象时,order对象不是持久的,只有invoice对象是持久的
Order o = getSession().load(Order.class,1L);
o.setInvoice(new Invoice(.........));
getSession().update(o);
在控制台中,我只能看到一条SQL语句,
在发票中插入(折扣、总计、订单ID、舍入、服务税、小计、附加费、增值税)值(?,,,,,,,,,?)
发票Id未在订单表中获得更新:(
有人能提出问题是什么吗
提前感谢….问题在于您使用实体/表和一对一映射样式的场景不正确。一对一的概念与您当前的表和实体设计不一致 请尝试在此处阅读更多关于一对一的内容: 在这里,您可以找到一对一映射的示例 如果您真的想继续进行一对一映射,您必须:
// just a draft, to give you idea about the
// "submissive" side mapping.
// All the ID stuff of the Invoice is driven by its
// "Master" - Order
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = @Parameter(name = "property", value = "order"))
@Id
@GeneratedValue(generator = "generator")
@Column(name = "ORDER_ID", unique = true, nullable = false)
public Integer getOrderId() {
return this.orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Order getOrder() {
return this.order;
}
请将其作为草稿,展示一对一概念的不同之处。这可能取决于您与众不同的设计 使用ORDR_uu中的INVOICE_ID和INVOICE_u中的ORDER_uid,两个表可以同时作为彼此的父表和子表 如果数据库使用外键,则删除和插入将很困难 您应该使用一个类型/表作为父级(例如,订单,因为它通常是第一个),另一个作为子级(订单id将在发票表中)
在你的对象模型中,你可以有两个方向(见第一个例子)谢谢@Radim,我是根据你的评论计算出来的。现在它可以工作了:)很高兴看到这一点。祝你冬眠好运。。。神奇的工具;)是的,你说的是对的。但我也尝试了单向,但并没有解决这个问题。不管怎样,我都像《贝娄邮报》中的“拉迪姆·克勒”所说的那样尝试过。感谢您的回复:)