Как обеспечить идентичность неуправляемых / управляемых объектов в OpenJPA? - PullRequest
1 голос
/ 10 мая 2011

Я использую OpenJPA для сохранения объектов.Первоначально я использовал OpenJPA 1.2, но затем обновился до OpenJPA 2.1.Объекты хранятся на сервере в памяти, они сериализуются клиенту и могут быть получены обратно без изменений.Dozer используется для удаления материалов JPA и всегда есть.Это не вызвало никаких проблем раньше.Я полагаюсь на то, что JPA сможет распознать @Id при сохранении сопоставленного с бульдозером объекта JPA.

Поэтому, по сути, у меня большой вложенный граф объектов, некоторые с двунаправленными (цилиндрическими) ссылками.Эта структура имеет данные, которые изменяются, и данные, которые не изменяются клиентом.Это отправлено клиенту, это могло или, возможно, не было сохранено прежде.Он сохраняется только после его отправки на сервер хотя бы один раз.У меня есть объект, который ссылается на другой объект в отношении OneToOne:

class A {
    @Column("b_id")
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    int id;
    @OneToOne
    @JoinColumn(name="b_id")
    B something
    @OneToOne
    Graph owner;
}

class B {
    @Column("b_id")
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    int id;
}

class Graph {
    @Column("graph_id")
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    int id;
    @OneToOne
    @Column
    A item;
}

Проблема заключается в том, что когда я получаю объект обратно *, это другой экземпляр объекта, который хранится на сервере, и он неуправляемый,Если я добавлю cascade = CascadeStrategy.ALL, я получу дубликаты вставок, так как он снова добавляет объект в базу данных.Если я оставлю это, я получу исключение, что JPA попытался сохранить неуправляемый объект, добавьте аннотацию.В итоге:

График еще не сохранен, равно как и A или B. После отправки Графика на сервер все они сохраняются.Сохраняется новый граф, который имеет другой A, но тот же B. Он не понимает, что B уже был сохранен, и создает его заново, хотя он имеет тот же @ Id.

У меня такое ощущение, чтоJPA не видит объект так же, как тот, который находится в памяти.

Я уверен, что OpenJPA 1.2, похоже, распознал объекты как эквивалентные на основе аннотации @Id.Я пытался исправить ссылки вручную и пытаться изменить ссылки с неуправляемых объектов на управляемые, загруженные в память на сервере.К сожалению, это работает, пока я не перезагружаю сервер, и это не исправляет ссылки, которые были сделаны ранее.Я знаю, что это неправильное решение.

Как мне решить эту проблему?

  • Я использую сериализацию GWT, и это прекрасно работает.Может ли GWT вызвать это?Я думаю, что это проблема JPA.

1 Ответ

0 голосов
/ 10 мая 2011

Пора использовать DTO, учитывая, что у вас есть некоторая ссылочная логика, которая должна произойти после возвращения объекта на сервер.

Вы можете создать классы Graph_Model, A_Model и B_Model (это объекты передачи данных) и использовать их при обращении к GWT-коду на стороне клиента. Когда Graph_Model приходит на сервер, вы можете создать управляемый объект Graph из Graph_Model и установить правильные ссылки, выполняя запросы.

Также странно, что класс A и Graph вообще не имеют свойства ID, поэтому они будут создаваться всякий раз, когда вы сохраняете объект типа Graph. У меня недостаточно информации, чтобы предложить что-то еще, не зная, что вы пытаетесь сделать, цель.

...