Обходной путь / избавление от множественных сопоставлений для записи в отношениях OneToMany и ManyToOne? - PullRequest
0 голосов
/ 28 июня 2011

Я пытался решить проблему, но сейчас застрял.
У меня есть 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.Другое дело, что у меня нет внешних ключей в моей модели данных, но я думаю, что это не проблема, потому что в отображениях я установил столбцы соединения.

1 Ответ

1 голос
/ 28 июня 2011

Вы не должны определять столбец BigInteger order имени order внутри OrderItem. Это будет сделано автоматически (в фоновом режиме) JPA. Компилятор жалуется, потому что вы создаете столбец, который уже был создан JPA.

...