Постоянство дочернего объекта с существующим родительским - PullRequest
4 голосов
/ 30 марта 2011

Предположим, что есть две сущности с отношением ManyToOne:

@Entity
public class A {
    private long code;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)   
    public long getCode() {
        return code;
    }

    public viod setCode(long code) {
        this.code = code;
    }

    // additional setters and getters
}

@Entity
public class B {
    private long code;
    private A a;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)   
    public long getCode() {
        return code;
    }

    public viod setCode(long code) {
        this.code = code;
    }   

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="acode", nullable=false)   
    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a
    }

    // additional setters and getters   
}

В рамках бизнес-потока у меня есть значение кода существующего объекта A, и мне нужно вставить новый объект B и связать его с существующимA. Этот код работает нормально:

// inject em
A a = em.find(A.class, code);
B b = new B();
b.setA(a);
em.persist(b);

Моя проблема связана со строкой "A a = em.find (A.class, code)".Для меня это выглядит как избыточный запрос, потому что таблица B содержит внешний ключ (acode).Чтобы улучшить производительность, я попытался создать объект с существующим значением кода:

A a = new A();
a.setCode(code);
B b = new B();
b.setA(a);
em.persist(b);

, но он не работает.Есть ли способ избежать ненужного запроса?

1 Ответ

5 голосов
/ 30 марта 2011

Существует специальный метод getReference(), который можно использовать вместо find() именно в этом сценарии.Создает прокси-объект с указанным идентификатором без выдачи очередей.Наличие A с этим идентификатором проверяется ограничением внешнего ключа на стороне базы данных при сохранении B.

A a = em.getReference(A.class, code);
B b = new B();
b.setA(a);
em.persist(b); 
...