JPA对映射@ManyToMany表示怀疑

时间:2012-03-10 03:47:57

标签: java java-ee jpa orm java-ee-6

您好我正在学习使用JPA的@ManyToMany关系映射。 我或多或少了解它是如何工作的,但我有一个疑问。让我先向您展示这段代码,我会做一些映射:

@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 个答案:

答案 0 :(得分:2)

好的,我在做了一些小实验后得到了答案。我认为这是正确的,它现在按照我的说法运作。 我所做的是,为关系添加一个名称,因为出于某种奇怪的原因,如果你没有指定名称,它会创建一个双向关系。

请参阅此代码修复它:

@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