Могу ли я вставить объект JPA напрямую с помощью QueryDSL?

Есть ли способ в QueryDSL вставить объект JPA без прямого использования поставщика JPA?

Моя проблема с вариантом использования заключается в следующем. Я использую Hibernate с отображением таблицы соединений между двумя объектами.

Ex:

public class Contract implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Version
    @Column(name = "version")
    private Integer version;

    private String number;
    private String volume;

    @ManyToMany
    @JoinTable(joinColumns = @JoinColumn(name = "contract_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "attachment_id", referencedColumnName = "id"))
    private List<Attachment> attachments;
}

Моя проблема в том, что если я попытаюсь одновременно добавить вложения в 2 отдельных потока, я получу оптимистичные исключения блокировки (как и ожидалось). Поэтому вместо этого я хотел бы попытаться добавить вложение напрямую с помощью команды вставки SQL.

Можно ли вставить объект Attachment через QueryDSL в качестве объекта? Я не смог найти никакой справочной документации, описывающей этот вариант использования. Только запрос на обновление, который требует настройки отдельных полей.

Псевдокод:

JPAQuery.insert(QAttachment.attachment).into(QContract.attachment).where(QContract.contract.id.eq(<contractId>));

Возможно ли что-то подобное?


person Eric B.    schedule 18.06.2014    source источник


Ответы (1)


Это не покрывается Querydsl, а также предложения INSERT также не покрываются JPA API, поэтому вам нужно будет выполнить вставку через JPA EntityManager API.

person Timo Westkämper    schedule 18.06.2014
comment
Я боялся этого. Благодарю за разъяснение. - person Eric B.; 19.06.2014