有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaHibernate不更新或删除,但插入

我正在处理一个现有的数据库,并创建了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插入一个带有OrderLine列表的新OrderHeader时,所有操作都会完美执行。但是,在对分离的、更改的OrderHeader调用session.update时,执行的唯一SQL语句是检索更新结果的select语句(这在一开始就没有发生)。当我试图删除OrderHeader时,情况变得更糟——尽管调用session.delete时在连接上设置了CascadeType.ALLorphanRemoval = true,但hibernate正在通过将OrderHeaderID设置为null来更新列表中的OrderLine,这会引发异常

这两个表的DDL只包含一个简单主键的普通数据定义。每个DAO操作都在一个双会话中执行

可能是我遗漏了什么吗?关系注释看起来不错,我非常确定我使用了正确的方法访问数据库(尽管我已经尝试了所有方法)。我真的没有选择了。欢迎任何建议,谢谢

编辑:更新了定义,现在我得到ERROR org.hibernate.util.JDBCExceptionReporter - Table 'dbname.orderheader_orderline' doesn't exist


共 (1) 个答案

  1. # 1 楼答案

    1-你的问题显然是@OneToMany映射,它应该是这样的:

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="orderHeader")
    List<OrderLine> orderLineList;
    
    • mappedBy值告诉JPA它是双向关系
    • 否@JoinColumn:它已在@manytone中设置

    2-也就是说,只在@OneToMany上保留级联和内容,然后删除:

    (fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    

    来自@manytone

    编辑以下是代码的外观: @有@JoinColumn的很多人。。。还有@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;
    }