我一直试图解决问题但现在卡住了。
我有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}}中定义。另一件事是我的数据模型中没有外键,但我认为这不是问题,因为在映射中我设置了连接列。
答案 0 :(得分:1)
您不得在BigInteger order
内定义名称为order
的列OrderItem
。它将由JPA自动(在后台)完成。编译器抱怨,因为您正在创建一个已由JPA创建的列。