我正在研究现有的数据库并创建了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 = truesession.deletehibernate正在通过将OrderLine设置为null来更新列表中的OrderHeaderIDs,这会引发异常。
这两个表的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;
}

10-07 16:47