Как установить имя ForeignKey, когда у меня есть @ManyToMany

Я создаю базы данных с использованием классов JPA.

Если у нас есть отношение ManyToOne, мы можем переопределить имя имени ForeignKey следующим образом:

@ManyToOne
@JoinColumn(foreignKey = @ForeignKey(name = "FK_COUNTRY"))
private Country country;

В DB мы получим такой результат:

enter image description here

Хорошо, это хорошо. хороший результат!

НО мне не удастся установить свои собственные имена FK, когда у меня есть @ManyToMany.

Как я могу создать это? Я пробую что-то вроде этого, но это не работает:

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "NEW_TABLE",  foreignKey = @ForeignKey(name = "FK_TEST"))

Или что-то вроде этого:

@JoinTable(
        name="NEW_TABLE",
        joinColumns=
            @JoinColumn(name="ID1", referencedColumnName="ID",  foreignKey = @ForeignKey(name = "FK_DEV_ID")),
        inverseJoinColumns=ID2", referencedColumnName="ID", foreignKey = @ForeignKey(name = "FK_DEV_ZONE"))
    )  

Или это:

@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(name="NEW_TABLE_2",
            joinColumns=
                @JoinColumn(name="ID1", referencedColumnName="ID", 
                            foreignKey = @ForeignKey(name = "FK_1")
                ),
            inverseJoinColumns=
                @JoinColumn(name="ID2", referencedColumnName="ID", 
                            foreignKey = @ForeignKey(name = "FK_2")
                ),

            foreignKey = @ForeignKey(name = "FK_1"),
            inverseForeignKey = @ForeignKey(name = "FK_2")
    )  

private List<MyObject> deviceZones;

Они не работают.

Я использую эту версию jars:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.6.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.6.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate.common</groupId>
    <artifactId>hibernate-commons-annotations</artifactId>
    <version>4.0.5.Final</version>
</dependency>


<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.2.Final</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.0.6.RELEASE</version>
</dependency>

И моя версия java 1.8

Ответ 1

Проблема была вызвана ошибкой спящего режима. Я тестировал hibernate 4.3.X. Решение. Обновите версию спящего режима. Проблема исправлена ​​в более новых версиях

Ответ 2

Я предполагаю, что у вас там какие-то конфликты с банками. Я предлагаю сделать это:

  • удалите следующие банки: hibernate-commons-annotations и hibernate-entitymanager
  • затем посмотрите здесь, как вы можете изменить имя внешнего ключа

Ответ 3

Держите его простым, если вы можете изменить структуру БД, будет проще генерировать только один внешний ключ

@OneToOne()
@JoinColumn(name="vehicle_id", referencedColumnName="vehicleId")
@ForeignKey(name="Fk_userdetails_vehicle")
public Vehicle getVehicle() {
   return vehicle;
}