У меня возникли проблемы с тем, чтобы ассоциация @ManyToOne была загружена lazilly. Я использую fetch = LAZY, но он не работает, когда соединение не производится столбцом первичного ключа.@ManyToOne (fetch = FetchType.LAZY) не работает с столбцом с непервичным ключом
Я знаю, что этот вопрос уже был asked, но я думаю, что на него не ответил должным образом, поэтому я предоставляю подробную информацию, чтобы прояснить проблему.
Это моя модель:
DummyB -> DummyA
Эти таблицы:
create table dummyA (
id number(18,0), --pk
name varchar2(20) -- unique field
);
create table dummyB (
id number(18,0),
dummya_id number(18,0),
dummya_name varchar2(20)
);
И эти лица:
@Entity
public class DummyA implements Serializable {
private Long id;
private String name;
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class DummyB implements Serializable {
private Long id;
private DummyA dummyA;
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
/* Case 1: mapping DummyB -> DummyA by DummyA NON primary key (field name) */
// @ManyToOne(fetch = FetchType.LAZY)
// @JoinColumn(name = "dummya_id")
// public DummyA getDummyA() {
// return dummyA;
// }
/* Case 2: mapping DummyB -> DummyA by DummyA primary key */
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dummya_name", referencedColumnName = "name")
@LazyToOne(LazyToOneOption.PROXY)
public DummyA getDummyA() {
return dummyA;
}
public void setDummyA(DummyA dummyA) {
this.dummyA = dummyA;
}
}
Примечание Метод getDummyA в сущности DummyB является дубликат попробуйте два случая присоединиться к объектам.
Случай 1: отображение DummyB -> DummyA по DummyA первичный ключ
@ManyToOne (скачивает = FetchType.LAZY) @JoinColumn (имя = "dummya_id")
Это прекрасно работает, просто один запрос выполняется для извлечения объектов DummyB.
Случай 2: отображение DummyB -> DummyA по DummyA NON первичного ключа (имя поля)
@ManyToOne (скачивает = FetchType.LAZY) @JoinColumn (имя = "dummya_name", referencedColumnName = имя " ")
Такой же фиктивный выбор выполняется, но сразу после этого выполняется выбор dummyA filtering по имени =? для получения связанного объекта A.
Я использую очень простой JUnit для выполнения фильтрации:
public class DummyTest {
@Autowired
HibernateTransactionManager transactionManager;
@Test
@Transactional
public void testFindDummyB() throws DAOException {
Long idDummyB = 2L;
Session session = getCurrentHibernateSession();
List lst = session.createCriteria(DummyB.class)
.add(Restrictions.eq("id", idDummyB)).list();
assertTrue(lst.size() > 0);
}
private Session getCurrentHibernateSession() {
return this.transactionManager.getSessionFactory().getCurrentSession();
}
}
Мои библиотеки:
- org.hibernate: зимовать одножильных: баночка: 4.2.17.Final: компилировать
- org.hibernate.common: hibernate-commons-annotations: jar: 4.0.2.Final: compile
- org.hibernate.javax.persistence: hibernate-jpa-2.0-api: jar: 1.0.1.Final: компилировать
- org.hibernate: гибернации-валидатор: баночка: 4.3.2.Final: при условии
Другие вещи, которые я уже пробовал: метод
Добавление @LazyToOne hiberante к getDummyA() Безразлично не имеет никакого эффекта.
@LazyToOne (LazyToOneOption.PROXY) @ManyToOne (выборка = FetchType.LAZY, опционально = истина) @JoinColumn (имя = "dummya_name", referencedColumnName = "название") @LazyToOne (LazyToOneOption.PROXY)
Создание внешнего ключа из таблицы DummyB в dummyA (и уникальное ограничение в поле dummya.name) не имеет никакого эффекта.
- Добавление @Column (unique = true) в метод DummyA getName() не удалось.
- Установите опцию = true или false, как предложено here.
Попытка принудительной ленивой загрузки с использованием setFetchMode в критериях не работает, выбор DummyA продолжает выполняться.
Список lst = session.createCriteria (DummyB.class) .add (Restrictions.eq ("id", idDummyB)). setFetchMode ("dummyA", FetchMode.SELECT) .list();
Я не могу найти в документации Hibernate в точку, где она относится к этому поведению, поэтому мне интересно, если есть что-то не так в моих аннотаций или я наткнулся на ошибку гибернации.
Может ли кто-нибудь сказать?
ОБНОВЛЕНО по заказу мкр-Dev: Чтобы установить его более ясным:
Является ли это ожидаемое поведение или это ошибка? если это ожидаемое поведение, где оно документировано?
спасибо.
Дело подвергается выше, является упрощение моего проблема, в моем фактическом случае столбец для соединения является уникальным столбцом. О том, если это не имеет смысла, это сложно объяснить, и это не вопрос моего вопроса, я спрашиваю: «Это ожидаемое поведение, если да, то где оно документировано?» – kothvandir
Пожалуйста, исправьте свой вопрос, потому что одно выше, чем неправильно. –
Это именно то, о чем я прошу в своем последнем абзаце, но, как вы просили, я поставил его более ясным. – kothvandir