Я работаю через ProJPA2, и в настоящее время я нахожусь в разделе по отображению коллекций.Вот следующий пример с картами:
Для меня это довольно запутанный текст для понимания.Это поднимает много вопросов без ответа.Одним из них является то, как, если я получаю Департамент с помощью запроса JPQL, как должна заполняться карта employeeByCubicle?Я понимаю, что использование «mappedBy» по существу говорит: «Я не несу ответственности за поддержание этих отношений: другая сторона есть, и вы найдете отношения в поле отдела в сущности Сотрудник».
Однако это не удовлетворяет вопросу: «Если вы извлекаете экземпляр Department, как предполагается, что employeeByCubicle должен быть заполнен?»
Это зависит от приложения (т.е. разработчикаприложение), чтобы вставить код для заполнения вручную коллекций (например, employeeByCubicle), которые принадлежат другой стороне отношений?В таком случае нельзя и не ожидать, что карта employeeByCubicle будет заполнена простым извлечением сущностей Department из БД: и это будет иметь место , поскольку отношение не принадлежит Department?
Спасибо.
РЕДАКТИРОВАТЬ
Я попытался реализовать пример из книги, и я не уверен, что делаюэто правильно - я могу получить данные кабинета / сотрудника, но я получаю ошибку «нулевой индексный столбец для сбора», когда пытаюсь получить их с помощью «select d from Department d», которая запускается и среди прочего кажетсяпопробуйте извлечь данные из таблицы EMPLOYEE:
Exception in thread "main" org.hibernate.HibernateException: null index column for collection: x.y.jpa.entity.Department.employeesByCubicle
Я попытался добавить nullable = true, необязательный = true, ничего не работает.В БД столбец CUB_ID указан как CUB_ID varchar(255) DEFAULT NULL
, как и должно быть - я хочу, чтобы этот столбец обнулялся.Но я не могу заставить его работать так, чтобы данные можно было выбирать.Это проблема с моими сопоставлениями?
Мои классы сущностей, Сотрудник и Отдел:
@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
...
@Basic(optional=true)
@Column(name="CUB_ID",nullable=true)
String cubicle;
...
}
@Entity
public class Department {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
...
@OneToMany(mappedBy="department")
@MapKeyColumn(name="CUB_ID",nullable=true)
private Map<String, Employee> employeesByCubicle;
...
}
Данные в MYSQL:
EDIT2
Я начинаю думать, что то, что я пытаюсь сделать, может быть недостижимым;если это тот случай, когда в отделе указано Map<String,Employee>
, то JPA перейдет к таблице «Сотрудник» и извлечет всех сотрудников для данного отдела, а затем для каждого сотрудника извлечет ячейку, а затем попытается поместить запись в карту.с k=cubicleid
, v=employee
, возможно, нет никакого способа сообщить JPA, что, если cubicleid имеет значение null, не пытайтесь поместить запись в карту.Это мышление правильно или неправильно?ТИА.