【问题标题】:Jpa + Spring Data : cascading of a collection with compound keyJpa + Spring Data:使用复合键级联集合
【发布时间】:2015-01-14 02:19:14
【问题描述】:

我目前正在为我的学校申请一个小商店。

我有 2 个要保存的对象:

Order.java

@Entity
@Table(name = "ORDERS")
public class Order {
    private Integer id;
    private Date orderDate;
    private MailingAddress mailingAddress;
    private User user;
    private Collection<OrderLine> orderLines;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

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

    @Basic
    @Column(name = "ORDER_DATE")
    public Date getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    @ManyToOne
    @JoinColumn(name = "SHIPPING_ADR_ID", referencedColumnName = "ID")
    public MailingAddress getMailingAddress() {
        return mailingAddress;
    }

    public void setMailingAddress(MailingAddress mailingAddressByShippingAdrId) {
        this.mailingAddress = mailingAddressByShippingAdrId;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USER_ID", referencedColumnName = "LOGIN")
    public User getUser() {
        return user;
    }

    public void setUser(User userByUserId) {
        this.user = userByUserId;
    }

    @OneToMany(mappedBy = "order", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    public Collection<OrderLine> getOrderLines() {
        return orderLines;
    }

    public void setOrderLines(Collection<OrderLine> orderLinesesById) {
        this.orderLines = orderLinesesById;
    }
}

OrderLine.java

@Entity
@Table(name = "ORDER_LINES", schema = "")
@IdClass(OrderLinesPK.class)
public class OrderLine {
    private int quantity;
    private Integer orderId;
    private String bookId;
    private Book book;
    private Order order;

    @Basic
    @Column(name = "QUANTITY")
    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Id
    @Column(name = "ORDERS_ID", insertable = false, updatable = false)
    public Integer getOrderId() {
        return orderId;
    }

    public void setOrderId(Integer ordersId) {
        this.orderId = ordersId;
    }

    @Id
    @Column(name = "BOOKS_ID", insertable = false, updatable = false)
    public String getBookId() {
        return bookId;
    }

    public void setBookId(String booksId) {
        this.bookId = booksId;
    }

    @ManyToOne
    @JoinColumn(name = "BOOKS_ID", referencedColumnName = "ISBN13", nullable = false, insertable = false, updatable = false)
    public Book getBook() {
        return book;
    }

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ORDERS_ID", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false)
    public Order getOrder() {
        return order;
    }

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

OrderLinesPK.java

public class OrderLinesPK implements Serializable {
    private int ordersId;
    private String booksId;

    @Column(name = "ORDERS_ID")
    @Id
    public int getOrderId() {
        return ordersId;
    }

    public void setOrderId(int ordersId) {
        this.ordersId = ordersId;
    }

    @Column(name = "BOOKS_ID")
    @Id
    public String getBookId() {
        return booksId;
    }

    public void setBookId(String booksId) {
        this.booksId = booksId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        OrderLinesPK that = (OrderLinesPK) o;

        if (ordersId != that.ordersId) return false;
        if (booksId != null ? !booksId.equals(that.booksId) : that.booksId != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = ordersId;
        result = 31 * result + (booksId != null ? booksId.hashCode() : 0);
        return result;
    }
}

一个订单包含一系列订单行。 我试图在一次调用 OrderRepository 时保存订单 + 订单行。 但是当我这样做时,我得到了错误

org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of edu.flst.bookstore.domaine.bo.OrderLinesPK.orderId

这很符合逻辑(我知道订单的 Id 在这个阶段是未知的,因为订单的主键是自动递增的(我使用 MySQL)。

我不知道如何通过 一次调用 对 orderService 进行这项工作(没有先使用 orderLinesRepository 保存 orderLines)。有可能吗?

问候

【问题讨论】:

    标签: java spring hibernate jpa spring-data


    【解决方案1】:

    一个订单可以包含多本书,而一本书可以出现在许多订单中。所以多对多关系本质上是您的 OrderLine 对象。我会在 OrderLine 中设置一个 id(自动生成)和两个多对一关系。然后你丢弃OrderLinesPK类,你把Order、Book和OrderLine对象按这个顺序保存在同一个事务中。这样你的模型就更简单了,你只需要在数据库中保存一个额外的id(没有物理意义) (OrderLine 对象的 id)

    【讨论】:

    • 感谢您的回答。不幸的是,数据库是练习的一部分,我无法更改它。因此,我无法为 orderLine 添加自动生成的 id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多