Apache Wicket, OpenJPA и Spring / ROO - PullRequest
       39

Apache Wicket, OpenJPA и Spring / ROO

1 голос
/ 12 октября 2010

Я установил приложение Spring ROO, установил постоянство для OpenJPA и создал несколько сущностей. Затем я заменил Spring MVC на Apache Wicket. Вещи, кажется, работают нормально, и я успешно отобразил список сущностей клиентов.

Затем был вид редактирования для клиента. На данный момент я создал форму Wicket, которая использует сущность OpenJPA непосредственно в качестве модели формы, и поэтому мне пришлось сделать класс сущностей реализующим Serializable.

Теперь я не уверен, как правильно реализовать постоянство OpenJPA, теперь у меня есть следующее:

@Override
protected void onSubmit() {
    try {
        if (customer.getId()!=null) {
            customer.merge();
        }
        else {
            customer.persist();
        }
    }
    catch (Exception e) {
        throw new Error(e);
    }
    super.onSubmit();
}

Это работает, но только один раз для объекта Customer. Каким-то образом. То есть я отправляю свою форму один раз, и она работает как с новым клиентом (.persist ()), так и с существующим клиентом (.merge ()). Однако я снова отправляю форму для того же клиента, у которого появляется эта ошибка (я добавил несколько разрывов строк здесь):

<openjpa-2.0.0-r422266:935683 nonfatal store error>
org.apache.openjpa.persistence.OptimisticLockException:
An optimistic lock violation was detected when flushing object instance "no.magge.iumb.domain.crm.PrivateCustomer-379" to the data store.
This indicates that the object was concurrently modified in another transaction.

У меня вопрос: как правильно сохранить OpenJPA и почему я получаю эту ошибку?

Wicket-wise: Должен ли я создать отдельную IModel Wicket с отсоединяемой моделью Customer и может ли это быть причиной того, что у меня возникли эти проблемы?

Большое спасибо за любые советы!

1 Ответ

2 голосов
/ 12 октября 2010

Сделайте себе одолжение и разделите свои прикладные уровни.Код в представлении никогда не должен обращаться к базе данных.

Создайте слой Service и / или слой Dao, протестируйте код этих слоев, чтобы убедиться, что они работают, а затем внедрите объект dao или service вкомпонент калитки.(Я бы порекомендовал вам использовать пружину для этого, но вы также можете сделать это вручную)

В вашем сценарии есть так много разных вещей, которые могут потерпеть неудачу в одном месте, и почти невозможно отделить их.

Вот несколько указателей:

...