解决方法/摆脱OneToMany和ManyToOne关系中的多个可写映射?

时间:2011-06-28 18:42:09

标签: java orm jpa glassfish one-to-many

我一直试图解决问题但现在卡住了。
我有2个实体类/表Order和OrderItem。 OrderItem有1个Order,Order有1 .. * OrderItems。

我的EJB工作正常,它会添加顺序,获取其ID并添加订单项

Order1 order = addOrder(project, name);
em.flush();
int orderId = order.getOrder();
addOrderItem(orderId, cart);

所以一切正常,订单ID也会根据需要插入到订单项行中。

但是现在我想用许多映射实体执行JPQL,包括Order和OrderItem。据我所知要执行查询,我需要先映射我的实体,所以问题出在我的映射中 这是映射

public class Order1 implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "order_")
    private Integer order;
... 
    @OneToMany(mappedBy="orders",targetEntity=OrderItem.class, 
    fetch=FetchType.EAGER, cascade = CascadeType.ALL)
    private List<OrderItem> orderItems;
...
}

public class OrderItem implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "order_item")
    private Integer orderItem;
    @Column(name = "order_" /*, insertable=false, updatable=false*/)
    private BigInteger order;
...
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="order_")
    private Order1 orders;
...
}

通过这种映射,我在编译时获得异常

Exception Description: Multiple writable mappings exist for the field [order_item.order_]. Only one may be defined as writable, all others must be specified read-only.

我用Google搜索并发现我必须使OrderItem中的订单列不可写。正如你在代码中看到的那样,我已经完成了它并且它编译了,但是当我在我的应用程序中下订单时,订单id到order_item的订单列没有插入并且是NULL。但我不能这样做,必须在order_item中有一个订单参考。

我的JPQL查询是createQuery("SELECT o.order FROM OrderItem oi JOIN oi.orders o"); 当我在order_item表中使订单列无法插入时,它可以工作,但不能这样做。有什么建议?我的映射有什么问题,为什么我不能在order_item中插入order_?


更新关于@toto回答:

我的实体是由Netbeans向导生成的。如果我不在BigInteger order中定义OrderItem,那么我无法将order id插入到我的order_item表中。

我的EJB方法如下:

public Order1 addOrder(BigInteger project, BigInteger name) {

    Order1 order = new Order1();
...
    em.persist(order);
    return order;
}

private void addOrderItem(int orderId, ProjectCart cart) {

    // convert orderId int to BigInteger
    BigInteger oId = new BigInteger(String.valueOf(orderId));
    OrderItem orderItem = new OrderItem();
    orderItem.setOrder(oId);
....
    em.persist(orderItem);
}

所以这意味着如果我离开OrderItem

@Column(name = "order_")
private BigInteger order1;

order1 OrderItem内的orderItem.setOrder(oId)的getter和setter将无法正常工作,我addOrderItem()方法order1中的OrderItem只会导致{{1}}不是{{1}}在{{1}}中定义。另一件事是我的数据模型中没有外键,但我认为这不是问题,因为在映射中我设置了连接列。

1 个答案:

答案 0 :(得分:1)

您不得在BigInteger order内定义名称为order的列OrderItem。它将由JPA自动(在后台)完成。编译器抱怨,因为您正在创建一个已由JPA创建的列。