JPA:对生成的JoinTable的引用

时间:2018-08-26 21:07:45

标签: java jpa entity-relationship

我有两个实体:Product和Aisle。 一种产品可以位于一个或多个通道中,而一个通道中可以具有一个或多个产品。

@Entity 
public class Product{
   @Id
   private Long id;
   private String name;
   @ManyToMany
   @JoinTable(name = "product_aisle",
            joinColumns = { @JoinColumn(name = "product_id") },
            inverseJoinColumns = { @JoinColumn(name = "aisle_id") })
    private Set<Aisle> aisles = new HashSet<>();
   /* getters, setters, equals and hashcode */
}


@Entity 
public class Aisle{
   @Id
   private Long id;
   private String row;
   private String shelf;
   @ManyToMany(mappedBy="aisles")
   private Set<Product> products = new HashSet<>();
   /* getters, setters, equals and hashcode */
}

我还有最后一个实体:推销员。 推销员负责通道中的产品:

@Entity 
public class Salesman{
   @Id
   private Long id;

   private String name;

   /* ManyToOne to  ProductAisle ?*/

}

问题:如何使用“ @ManyToOne”注释将推销员引用到自动创建的联接表(ProductAisle)中?

致谢

2 个答案:

答案 0 :(得分:0)

由于AisleProduct都具有双向映射,因此您可以将它们(或什至两个)都加入Salesman类,而不必根本不需要加入服务表。

答案 1 :(得分:0)

要表示位于特定Product中的Aisle,您需要另一个实体。这是一个示例:

@Entity 
public class Product{
   @Id
   private Long id;
   private String name;
   @OneToMany(mappedBy = "product")
   private Set<ProductAisle> productAisle = new HashSet<>;
   /* getters, setters, equals and hashcode */
}


@Entity 
public class Aisle{
   @Id
   private Long id;
   private String row;
   private String shelf;
   @OneToMany(mappedBy = "aisle")
   private Set<ProductAisle> productAisle = new HashSet<>();
   /* getters, setters, equals and hashcode */
}

@Entity 
public class ProductAisle{
   @Id
   private Long id;
   @ManyToOne(fetch = FetchType.LAZY)
   private Product product;
   @ManyToOne(fetch = FetchType.LAZY)
   private Aisle aisle;
   /* getters, setters, equals and hashcode */
}

然后您的Salesman将指向ProductAisle实例的集合,这些实例将产品与过道映射:

@Entity 
public class Salesman{
   @Id
   private Long id;

   private String name;

   @ManyToOne(fetch = FetchType.LAZY)
   private Set<ProductAisle> productAisle;

}