Как справиться с потерянными строками в отображении JPA @OneToOne

Я пытаюсь разработать автономное приложение Java, использующее JPA (Hibernate 4.3).

Это обеспечивает доступ к базе данных zos DB2 v10.

У двух моих объектов есть сопоставление @OneToOne, которое я хочу LAZY загрузить.

У меня проблема в том, что в родительской таблице есть строки, которых нет в дочерней таблице.

Я использую

@OneToOne(optional = false, fetch = FetchType.LAZY)

Что отлично работает, когда значение столбца соединения существует в обеих таблицах, однако мои данные несовместимы, и я имею случаи, когда значения существуют только в родительской таблице.

я пытался добавить

@NotFound(action=NotFoundAction.IGNORE)

Для моего сопоставления @OneToOne безрезультатно.

Возможно ли LAZY LOAD @OneToOne отношения, где не всегда есть строка в каждой таблице?

У моих двух объектов есть эти аннотации для сопоставления OneToOne

@Entity
@Table(name = "TABLE0001")
@BatchSize(size = 100)
public class Table_0001 {

    /**
     * Related Table
     */
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "PTY_ID")
    @BatchSize(size = 100)
    private Table_0002 table0002;

    public Table_0002 getTable0002() {
        return table0002;
    }

    public void setTable0002(final Table_0002 table0002) {
        this.table0002 = table0002;
    }

}

@Entity
@Table(name = "TABLE0002")
@BatchSize(size = 100)
public class Table_0002 {

}

Мне нужна LAZY загрузка между этими двумя объектами.

Я получаю список Table_0001, а затем хочу получить Table_0002 партиями по 100. Все это будет работать с показанными аннотациями, ЕСЛИ в Table_0001 не существует идентификаторов, которых нет в Table_0002.

Это код Java, который я использую для получения списка Table_0001.

private static Collection<? extends Table_0001> getAllModelsIterable(final String filter, final int offset, final int max) {

    final CriteriaBuilder criteriaBuilder = PersistenceManager.INSTANCE.getCriteriaBuilder();

    final CriteriaQuery<Table_0001> criteriaQuery = criteriaBuilder.createQuery(Table_0001.class);
    Root<Table_0001> personRoot = criteriaQuery.from(Table_0001.class);
    criteriaQuery.select(personRoot);
    criteriaQuery.where(criteriaBuilder.like(personRoot.get(Table_0001_.filter), filter));
    criteriaQuery.orderBy(criteriaBuilder.asc(personRoot.get("id")));

    final TypedQuery<Table_0001> typedQuery = entityManager.createQuery(criteriaQuery);
    typedQuery.setFirstResult(offset);
    typedQuery.setMaxResults(max);

    return typedQuery.getResultList();

}

person Hector    schedule 19.01.2015    source источник
comment
Как вы запрашиваете свои данные?   -  person Predrag Maric    schedule 19.01.2015


Ответы (1)


вот документация по jpa и необязательному атрибуту. В нем говорится:

логический необязательный (Необязательный) Является ли ассоциация необязательной. Если установлено значение false, то всегда должна существовать ненулевая связь. Значение по умолчанию: true Начиная с: JPA 1.0

Что происходит, когда вы устанавливаете необязательный атрибут в значение true?

person bobK    schedule 19.01.2015
comment
Поскольку мне нужна LAZY загрузка этого сопоставления OneToOne, я использую необязательный false, это вызывает исключения, когда строки существуют только в одной из таблиц. Когда я устанавливаю необязательное значение true, я не получаю исключения, однако я также не получаю ленивую загрузку - person Hector; 19.01.2015