Hibernate mapowanie many-to-many używając innej kolumny niż primary

0

Pytanie jest bardziej o bazy danych, ale wiąże się z javowym Hibernate.
Jestem początkującym użytkownikiem Hibernate i niezbyt zaawansowanym bazodanowcem.
Mamy takie klasy:

public class Foo {
    private Long id;
    private Map<Bar, String> bars;
}

public class Bar {
    private Long id;
}

Oraz takie tabele:

foo:
id | foo_bar_id
bar:
id
foo_bar:
id | bar_id | text

Stworzyłem taką konfigurację:

<class name="Foo" table="foo">
    <id name="id" column="id" />
    <map name="bars" table="foo_bar">
        <key column="id">
        <map-key-many-to-many column="bar_id" class="Bar" />
        <element column="text" type="text" />
    </map>
</class>

Problem polega na tym, że Hibernate joinuje tabele foo i foo_bar zawsze po foo.id, kiedy ja chcę określić kolumnę, po której ma joinować (foo.foo_bar_id). Niestety nie znalazłem takiej opcji. Jest jedynie property-ref, ale to wymagałoby stworzenia dodatkowego, nadmiarowego property w klasie Foo. Takich map jest trochę więcej w tej i kilku innych klasach (kilka tabel zawiera klucze obce do naszego foo_bar). Jak więc najprościej to zrobić?

0

public class Foo {
    private Long id;
    private Set<FooBar> foobars;

    public Set<Bar> getBars() {
       Set<Bar> bars = new HashSet<Bar>(foobars.size());
       for(FooBar foobar: foobars) {
              bars.add(foobar.getBar());
       }
       return Collections.unmodifiableSet(bars);
   }

    public void addBar(Bar bar, String text) {
        if (!getBars().contains(bar)) {
                foobars.add(new FooBar(this, bar, text));
        }
    }
}

public class FooBar {
    private Foo foo;
    private Bar bar;
    private String text;
}
 
public class Bar {
    private Long id;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1