Слияние объекта с отношением FetchType.EAGER приводит к «FailedObject» - PullRequest
0 голосов
/ 26 июля 2011

У меня есть объект VM с отношением к другому объекту BP. Отношения с нетерпением получаются. Сначала я загружаю ВМ. После загрузки виртуальная машина отсоединяется, сериализуется и изменяется на стороне клиента. Теперь я хочу обновить измененную сущность, поэтому я использую метод EntityManager.merge () из JPA. Теперь я сталкиваюсь со следующей ошибкой из OpenJPA:

"Обнаружен новый объект в постоянном поле" Vm.bp "во время присоединения. Однако это поле не разрешает каскадное присоединение. Установите для каскадного атрибута этого поля значение CascadeType.MERGE или CascadeType.ALL (аннотации JPA) или "объединить" или "все" (JPA orm.xml). Вы не можете прикрепить ссылку на новый объект без каскадирования. "

Почему я должен добавить Cascade.MERGE к отношению к другому объекту, который никогда не изменится? И почему JPA считает, что BP - это новый объект («... не может прикрепить ссылку на новый объект ...»)? При использовании отношений ManyToOne мне всегда нужно добавлять Cascade.MERGE, чтобы обновить сущность, или это из-за типа извлечения EAGER?

Вот моя сущность:

@Entity
@Table(name = "VM")
public class Vm extends BaseEntity implements Serializable {
    public static final long serialVersionUID = -8495541781540291902L;
    @Id
    @SequenceGenerator(name = "SeqVm", sequenceName = "SEQ_VM")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SeqVm")
    @Column(name = "ID")
    private Long id;
    // lots of other fields and relations

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "BP_ID")
    private Bp bp;

    // ...
}

1 Ответ

0 голосов
/ 12 августа 2011

Я нашел причину появления этого сообщения об ошибке: Поле аннотированной базы данных @Version связанной сущности Bp было инициализировано значением «0». Очевидно, OpenJPA (1.2.3) не может справиться с нулевыми версиями сущностей.

Установка версии 1 решила мою проблему.

...