如何在Hibernate中将OneToMany关系映射到弱实体

时间:2015-04-21 00:21:15

标签: java hibernate jpa orm

我需要使用JPA注释在hibernate中映射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;
}

现在, 无法知道将分配给新订单的标识符 在插入之前,例如我可以在OrderItem类中使用Annotations以便自动(以级联模式)提交正确的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"

1 个答案:

答案 0 :(得分:0)

好的,我将尝试添加您需要具有以上给定方案的实体类。

@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
}

然后是OrderItem类

@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
}

另外我得到你的setname映射到哪一列..而iditem并不是生成的值,它的指定id类型 那么它也可能是关于的问题,谁可能是关系owener .. Inverse = true与 mappedBy 属性使用相同的行为,所以尝试改变它.. 让我知道这是否有效,或者你在尝试这个时遇到问题..