Java 如何在Hibernate中映射具有弱实体的单域关系

Java 如何在Hibernate中映射具有弱实体的单域关系,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我需要在hibernate中用JPA注释映射一个OneToMany关系,其中涉及一个弱实体。 例如 表顺序: CREATE TABLE orders( idorder serial NOT NULL, note varchar(30), CONSTRAINT orders_pkey PRIMARY KEY (idorder) ) 表OrderItems: CREATE TABLE orderitems( idorder integer NOT NULL, iditem serial N

我需要在hibernate中用JPA注释映射一个OneToMany关系,其中涉及一个弱实体。
例如
表顺序:

CREATE TABLE orders(
idorder serial NOT NULL,
note varchar(30),
CONSTRAINT orders_pkey PRIMARY KEY (idorder)
)
表OrderItems:

CREATE TABLE orderitems(
  idorder integer NOT NULL,
  iditem serial NOT NULL,
  qnt integer,
  CONSTRAINT orderitems_pk PRIMARY KEY (idorder, iditem),
  CONSTRAINT fk_orderitems FOREIGN KEY (idorder)
      REFERENCES orders (idorder) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
在我的类“Orders”中,我通过以下方式实现了getOrderItem()方法:

// i need cascadeType.All here
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "order")
public Set<OrderItem> getOrderItems() {
    return items;
}
//我需要cascadeType。全部在这里
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“order”)
公共集getOrderItems(){
退货项目;
}
现在,, 无法知道将分配给新订单的标识符 在插入之前,我可以在类OrderItem中使用注释,以便自动(以级联模式)提交正确的idOrder吗?
我的目标是得到这样的局面

Order myOrder = new Order();
//      myOrder.setId(1) not necessary
myOrder.setNote("orderNote");

OrderItem firstItem = new OrderItem();  
// firstItem.setIdOrder()       no need to specify idorder
// firstItem.setId(12);
firstItem.setName("firstItem");
firstItem.setQnt(2);

OrderItem secondItem = new OrderItem();
// secondItem.setId(13);
secondItem.setName("secondItem");
secondItem.setQnt(4);

Set<OrderItem> items = new HashSet<OrderItem>();
items.add(firstItem);
items.add(secondItem);

myOrder.setItems(items);

OrderDAO dao = new OrderDAO();
dao.save(myOrder);  // i want inser all items in cascade with the idOder assigned to "myOrder"
Order myOrder=新订单();
//myOrder.setId(1)不是必需的
myOrder.setNote(“orderNote”);
OrderItem firstItem=新的OrderItem();
//setIdOrder()无需指定idorder
//第一项。setId(12);
firstItem.setName(“firstItem”);
第一项。设置(2);
OrderItem secondItem=新OrderItem();
//第二项。setId(13);
secondItem.setName(“secondItem”);
第二项。设置(4);
Set items=new HashSet();
添加(第一项);
添加(第二项);
myOrder.setItems(项目);
OrderDAO=新的OrderDAO();
dao.save(myOrder);//我希望将所有项目与分配给“myOrder”的IDOrder一起级联插入

好的,我将尝试添加您在上述给定场景中需要的实体类

@Entity
@Table(name="orders")
public class Order{

    @Id
    @GeneratedValue
    @Column(name="ID")
    private Long id;

    @Column(name="note ")
    private String note ;

    @OneToMany(mappedBy="orders")
    private Set<OrderItem> orderitems;

    // Getter and Setter methods
}
我也不知道你的设置名映射到哪一列。。iditem不是为其指定的id类型生成的值 好吧,那么谁可能是欧纳的关系也可能是个问题。。Inverse=true与mappedBy属性用法的行为相同,因此请尝试更改它。。
让我知道这是否有效,或者您在尝试时遇到问题。

对于您的情况,您应该阅读本教程,谢谢。不幸的是,即使这样,我也能修复它。不在OrderItems范围内插入任何值。idLibro@Pierock有什么例外吗??您第一次提到的idLibro是什么?。目前,使用此配置,运行命令dao.save(我的命令),我得到:-Hibernate:/*插入comp.Order/insert-into public.orders(注意)值(?)-Hibernate:/update comp.OrderItem*/update public.orderItems set qnt=?其中iditem=?org.hibernate.StaleStateException:批处理更新从更新[0]返回意外的行数;实际行数:0;预期:1StaleStateTeException通常在hibernate找不到需要更新的所有行时引起。这意味着,当您尝试更新从数据库中提取的某些对象时,它们实际上并不存在。另外,尝试分别使用save和update,使用saveorupdate可能会给我们一个线索。事实上,我不知道为什么会启动更新。我的指令正是我在帖子中描述的,目前数据库中的表Orders和OrderItems都是空的。
@Entity
@Table(name="OrderItems")
public class OrderItem{

    @Id
    @Column(name="iditem")
    private Long iditem;

    @Column(name="qnt")
    private long qnt ;

    @ManyToOne
    @JoinColumn(name="idorder")
    private Order order;

    public OrderItem() {

    }

    // Getter and Setter methods
}