Hibernate onetomany级联不起作用

时间:2014-05-05 15:32:55

标签: java hibernate jpa

@OneToManyCascadeType.All无法正常工作。

这是我的代码。

'一方'

@Entity
@Table(name = "orders")
public class Order {
    private long id;
    private User usersByUserId;
    private Collection<OrderBook> orderBooksById = new HashSet<>();

    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
    public User getUsersByUserId() {
        return usersByUserId;
    }

    public void setUsersByUserId(User usersByUserId) {
        this.usersByUserId = usersByUserId;
    }

    @OneToMany(mappedBy = "pk.order", cascade = CascadeType.ALL)
    public Collection<OrderBook> getOrderBooksById() {
        return orderBooksById;
    }

    public void setOrderBooksById(Collection<OrderBook> orderBooksById) {
        this.orderBooksById = orderBooksById;
    }
}

和“很多”方面。

@Entity
@Table(name = "order_book")
public class OrderBook {
    private OrderBookPK pk = new OrderBookPK();
    private int num;

    @EmbeddedId
    public OrderBookPK getPk() {
        return pk;
    }

    public void setPk(OrderBookPK pk) {
        this.pk = pk;
    }

    @Transient
    public Book getBook(){
        return getPk().getBook();
    }

    public void setBook(Book book){
        getPk().setBook(book);
    }

    @Transient
    public Order getOrder(){
        return getPk().getOrder();
    }

    public void setOrder(Order order){
        getPk().setOrder(order);
    }

    @Basic
    @Column(name = "num")
    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

@Embeddable
public class OrderBookPK implements Serializable {
    private Order order;
    private Book book;

    @ManyToOne
    @JoinColumn(name="order_id", referencedColumnName = "id", nullable = false)
    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    @ManyToOne
    @JoinColumn(name="book_id", referencedColumnName = "id", nullable = false)
    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }
}

我在我的服务中使用它。

@Transactional
public void addOrder(OrderFrom orderFrom) {
    Order order = new Order();
    User user = orderForm.getUser();
    order.setUsersByUserId(user);
    for (OrderFrom.OrderItem item: orderFrom.getOrderItems()){
        Book book = item.getBook();
        OrderBook orderBook = new OrderBook();

        orderBook.setOrder(order);
        orderBook.setBook(book);
        orderBook.setNum(item.getNumber());

        order.getOrderBooksById().add(orderBook);
    }
    orderDao.addOrder(order);
}

我预计它会像cascade所期望的那样保存秩序以及它的子节点。但是当我运行它时,只保存订单而没有抛出异常。

Hibernate: insert into orders (user_id, id) values (?, ?)

我在互联网上搜索了thisthis,但不适用于我的情况。

0 个答案:

没有答案