[英]Hibernate Insert is trying to update identity column
我是Hibernate的新手,尝试在数据库中保留对象时遇到一些问题。
@Entity
@Table(name="order")
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long number;
@Column(name="date")
private Timestamp date;
@Column(name="obs")
private String obss;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name="id", referencedColumnName="number")
private List <OrderDetail> orderDetail;
(...)
和OrderDetail类
@Entity
@Table(name="orderDetail")
public class OrderDetail implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name="orderType")
private Long orderType;
(...)
当我尝试将对象保存到数据库时,出现以下错误:
Hibernate:
insert
into
order
(date, obs, rejectObs, pid, destiny, stateId, userId, version)
values
(?, ?, ?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
OrderDetail
(boxId, date, digitalid, documentId, rejectObs, obs, orderId, stateId, orderType)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?,)
Hibernate:
update
OrderDetail
set
id=?
where
id=?
16/09/2014 11:50:03 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 8102, SQLState: S1000
16/09/2014 11:50:03 org.hibernate.util.JDBCExceptionReporter logExceptions
ERROR: Cannot update identity column 'id'.
16/09/2014 11:50:03 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
GRAVE: Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: could not insert collection: [com.sa.ra.entities.Order.orderDetail#4252]
我不知道为什么Hibernate试图更新orderDetail表。 有人知道发生了什么吗? 即时通讯使用SQL Server 2008和休眠3.5.0
有一个概念错误。
您要让hibernate引用两个实体,并将它们的ID用作彼此的主键和外键。 错了
将两个实体建立一对多关系的正确方法是在“许多”侧添加一个外键,该外键必须引用“一个”类的主键。 这是数据库问题,不仅是休眠限制。
您可以在此处阅读有关Hibernate Collections的更多信息。
根据上述文档,您必须按如下方式修改代码:
“一个”方面
@Entity
@Table(name="order")
public class Order implements Serializable {
[...]
@OneToMany(targetEntity = OrderDetail.class, cascade = CascadeType.ALL, mappedBy = "order", fetch = FetchType.LAZY)
private List <OrderDetail> orderDetail;
[...]
}
然后,“许多”方面:
@Entity
@Table(name="orderDetail")
public class OrderDetail implements Serializable {
[...]
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
@JoinColumn(name = "order_id", nullable = false)
private Order order;
[...]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.