JPA сомневается в отображении @ManyToMany - PullRequest
3 голосов
/ 10 марта 2012

Привет, я узнаю о сопоставлении отношений @ManyToMany с использованием JPA. Я более или менее понимаю, как это работает, но у меня есть сомнения. Позвольте мне сначала показать вам этот код, где я делаю отображение:

@Entity
public class EntityE implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long eId;
    @ManyToMany
    @JoinTable(joinColumns =
    @JoinColumn(name = "eId"), inverseJoinColumns =
    @JoinColumn(name = "fId"))
    private Collection<EntityF> entityFs;
    //...
}

Также смотрите эту другую сущность:

@Entity
public class EntityF implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long fId;    
    private Collection<EntityE> entityEs;
    //...
 }

Вот что я получаю в базе данных:

enter image description here

Мои сомнения:

-Я хочу создать отношение @ManyToMany, где EntityE является владельцем отношения, правильный ли это подход?

-Я хочу, чтобы отношения были однонаправленными, поэтому предполагается создать только одну таблицу-посредник с именем EntityB_EntityF. Но по какой-то причине он создает также вторую таблицу с именем EntityF_EntityE. Я не понимаю, почему это так? Это нормально? и если нет, то как мне это исправить?

1 Ответ

2 голосов
/ 10 марта 2012

Хорошо, я только что получил ответ после небольшого эксперимента. Я думаю, что он правильный, теперь он работает, как я и предполагал. Я добавил имя для отношения, потому что по какой-то странной причине, если вы не укажете имя, оно создаст двунаправленное отношение.

См. Этот код исправил это:

@Entity
public class EntityE implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long eId;
    @ManyToMany
    @JoinTable(name="entitye_entityf",joinColumns =
    @JoinColumn(name = "eId"), inverseJoinColumns =
    @JoinColumn(name = "fId"))
    private Collection<EntityF> entityFs;

Вот другая сущность.

@Entity
public class EntityF implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long fId; 
    @ManyToMany
    @JoinTable(name="entitye_entityf",joinColumns =
    @JoinColumn(name = "fId"), inverseJoinColumns =
    @JoinColumn(name = "eId"))
    private Collection<EntityE> entityEs;

Так что, как видно из картинки, удалось разрешить мои сомнения. Я надеюсь, что этот ответ может быть полезен и для кого-то еще.

enter image description here

...