#java #database #hibernate #join
#java #База данных #hibernate #Присоединиться
Вопрос:
У меня есть следующие две таблицы:
@Entity
@Table(name = "zip_codes_germany")
public class ZipCodeArea implements Serializable {
@Id
@Column(name="zip_code")
private String zipCode;
@Column(name = "city")
private String city;
@ManyToMany
private Set<TravelAgency> agencies;
и
@Entity
@Table(name = "travel_agencies")
public class TravelAgency implements Serializable {
@Id
@Column(name = "name")
private String name;
@Id
@Column(name = "city")
private String city;
@Column(name = "ceo")
private String ceo;
@ManyToMany
@JoinTable(name = "travel_agency_zip_codes", joinColumns = {
@JoinColumn(name = "city", referencedColumnName = "city"),
@JoinColumn(name = "name", referencedColumnName = "name") }, inverseJoinColumns = @JoinColumn(name = "zip_code"))
private Set<ZipCodeArea> zipCodeAreas;
заполнен некоторыми данными. Где у travel_agencies есть составной ключ из столбцов name
, а у city
и zip_codes_germany есть первичный ключ zip_code
.
У меня уже есть следующие данные в моих таблицах:
При загрузке туристического агентства «Nice Guys Company» я бы хотел, чтобы оно содержало набор со всеми ZipCodeArea
элементами, принадлежащими городу «Фрайбург-им-Брайсгау». Итак, следующий тест должен выполняться через:
@Before
public void init() {
try {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
} catch (Exception e) {
logger.error("Failed to create hibernate session: ", e);
}
}
@Test
public void testManyToMany() {
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<TravelAgency> cq = criteriaBuilder.createQuery(TravelAgency.class);
Root<TravelAgency> root = cq.from(TravelAgency.class);
cq.select(root).where(criteriaBuilder.like(root.get("name"), "Nice Guys Company"));
List<TravelAgency> result = session.createQuery(cq).getResultList();
assertFalse(result.isEmpty());
assertFalse(result.get(0).getZipCodeAreas().isEmpty());
}
Проблема в том, что мое объявление «многие ко многим» не отображает город в город, следовательно, второй assertFalse
метод завершается неудачей. Есть ли способ это исправить?
Я попробовал следующее в TravelAgency
классе
@ManyToMany
@JoinTable(name = "travel_agency_zip_codes", joinColumns =
@JoinColumn(name = "city", referencedColumnName = "city")
, inverseJoinColumns = @JoinColumn(name = "city", referencedColumnName = "city"))
private Set<ZipCodeArea> zipCodeAreas;
но это привело к следующему исключению:
aused by: org.hibernate.AnnotationException: referencedColumnNames(city) of ZipCodeArea.zipCodeAreas referencing TravelAgency not mapped to a single property
at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:333)