我正在研究现有的数据库并创建了Hibernate实体。有问题的实体是OrderHeader
,它有一个OrderLine
列表。这是我的地图:
@Entity
@Table(name = "orderline")
public class OrderLine implements Serializable {
@Id
@Column(name = "OrderLineID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer orderLineID;
@ManyToOne
@NotNull
OrderHeader orderHeader;
}
...
@Entity
@Table(name = "orderheader")
public class OrderHeader implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "OrderHeaderID")
int orderHeaderId;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
List<OrderLine> orderLineList;
}
执行的所有操作都在分离的实体上。当我使用
session.save
插入一个包含OrderHeader
列表的新OrderLine
时,一切都会完美执行。但是,在对分离的、已更改的session.update
调用OrderHeader
时,唯一正在执行的SQL语句是检索更新结果的select语句(这在一开始并没有发生)。当我试图删除OrderHeader
时,情况会变得更糟——尽管在调用CascadeType.ALL
时在join上设置了orphanRemoval = true
和session.delete
hibernate正在通过将OrderLine
设置为null来更新列表中的OrderHeaderID
s,这会引发异常。这两个表的DDL只包含带有一个简单主键的纯数据定义。每个DAO操作都在invidual会话中执行。
可能是我遗漏了什么?关系注释看起来没问题,我很确定我使用了正确的方法来访问数据库(尽管我已经尝试了所有方法)。我已经没有选择了。欢迎任何建议,谢谢
编辑:更新了定义,现在我得到
ERROR org.hibernate.util.JDBCExceptionReporter - Table 'dbname.orderheader_orderline' doesn't exist
最佳答案
1-您的问题显然是@OneToMany映射,应该如下所示:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="orderHeader")
List<OrderLine> orderLineList;
告诉JPA它是双向关系的mappedBy值
没有@JoinColumn:它已经在@ManyToOne中设置了
2-也就是说,将级联和内容仅保留在@OneToMany上并移除:
(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
从“曼尼托内”。。
编辑以下代码的外观:
@有@JoinColumn的manytone。。。还有@OneToMany和mappedBy房产
@Entity
@Table(name = "orderline")
public class OrderLine implements Serializable {
@Id
@Column(name = "OrderLineID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer orderLineID;
@ManyToOne
@JoinColumn(name = "OrderHeaderID")
OrderHeader orderHeader;
}
...
@Entity
@Table(name = "orderheader")
public class OrderHeader implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "OrderHeaderID")
int orderHeaderId;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="orderHeader")
List<OrderLine> orderLineList;
}