Я пытался решить проблему, но сейчас застрял.
У меня есть 2 класса / таблицы сущностей Order и OrderItem.OrderItem имеет 1 Order, а Order имеет 1 .. * OrderItems.
Мой EJB работает нормально, добавляет заказ, получает его идентификатор и добавляет элементы заказа
Order1 order = addOrder(project, name);
em.flush();
int orderId = order.getOrder();
addOrderItem(orderId, cart);
Так что все работает нормально,идентификатор заказа вставляется также в строку элемента заказа по мере необходимости.
Но теперь я хочу выполнить 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.
Я погуглил и обнаружил, что я должен сделать столбец порядка в OrderItem недоступным для записи.Как вы можете видеть в коде, я сделал это, и он компилируется, но когда я размещаю заказ в моем приложении, то идентификатор заказа в столбец заказа order_item не вставляется и имеет значение NULL.Но я не могу оставить это так, в order_item должна быть ссылка на заказ.
Мой JPQL-запрос createQuery("SELECT o.order FROM OrderItem oi JOIN oi.orders o");
Он работает, когда я делаю столбец заказа в таблице order_item не удаляемым, но его нельзя оставитьсюда.Какие есть предложения?Что не так в моем отображении и почему я не могу добавить order_ в order_item?
update about @toto answer:
Мои объекты были созданыМастер 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)
в addOrderItem()
метод просто потому, что мой order1
не определен в OrderItem
.Другое дело, что у меня нет внешних ключей в моей модели данных, но я думаю, что это не проблема, потому что в отображениях я установил столбцы соединения.