Hibernate: могу ли я использовать @ManyToMany для отображения enities двух таблиц, используя только один элемент составного ключа?

#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;
  

и

travel_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)