JPA与实体的多对多关系

JPA与实体的多对多关系,jpa,orm,mapping,many-to-many,Jpa,Orm,Mapping,Many To Many,我在JPA中试图与三个实体建立多个关系时遇到了一个问题 命令 产品 修饰语 我有一个实体来处理多对多的关系 订单产品(订单id和产品id) 包含一个订单可以有多个产品的关系 订单详细信息(订单产品id和修改器id) 包含先前关系订单产品的id和修饰符的id,修饰符是一组可能影响产品价格的多个值 我不太清楚如何在JPA中处理这种关系,因为我是新手。您需要一个带有复合键的连接实体。你需要进一步研究它 您的实体: @Entity @Table(name = "ordertable&

我在JPA中试图与三个实体建立多个关系时遇到了一个问题

  • 命令
  • 产品
  • 修饰语
我有一个实体来处理多对多的关系

  • 订单产品(订单id和产品id) 包含一个订单可以有多个产品的关系
  • 订单详细信息(订单产品id和修改器id) 包含先前关系订单产品的id和修饰符的id,修饰符是一组可能影响产品价格的多个值

我不太清楚如何在JPA中处理这种关系,因为我是新手。

您需要一个带有复合键的连接实体。你需要进一步研究它

您的实体:

@Entity
@Table(name = "ordertable")
@Data
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany(mappedBy = "order")
    @EqualsAndHashCode.Exclude
    private Set<OrderProductModifier> products;
   
}
@Entity
@Table(name = "product")
@Data
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @EqualsAndHashCode.Exclude
    private BigDecimal unitPrice;
  
}
@Entity
@Table(name = "modifier")
@Data
public class Modifier {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @EqualsAndHashCode.Exclude
    private BigDecimal modifier;
}
这很容易使用:

private void run() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("UsersDB");
    EntityManager em = factory.createEntityManager();
     
    em.getTransaction().begin();
    
    Product product = new Product();
    product.setUnitPrice(BigDecimal.TEN);
    em.persist(product);

    Modifier modifier = new Modifier();
    modifier.setModifier(new BigDecimal(".90"));
    em.persist(modifier);

    Order order = new Order();
    em.persist(order);

    OrderProductModifier opm = new OrderProductModifier();
    opm.setId(new OrderProductModifierId());
    opm.setOrder(order);
    opm.setProduct(product);
    opm.setModifier(modifier);
    em.persist(opm);
    
    em.getTransaction().commit();

    em.clear();

    Order o = em.createQuery("select o from Order o join fetch o.products where o.id = 1", Order.class).getSingleResult();
    System.out.println("Order for " + o.getProducts());
    System.out.println("Order cost " + o.getProducts().stream().map(p->p.getProduct().getUnitPrice().multiply(p.getModifier().getModifier()).doubleValue()).collect(Collectors.summingDouble(Double::doubleValue)));

}
上面的查询可能更好,但这会给您一些工作

private void run() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("UsersDB");
    EntityManager em = factory.createEntityManager();
     
    em.getTransaction().begin();
    
    Product product = new Product();
    product.setUnitPrice(BigDecimal.TEN);
    em.persist(product);

    Modifier modifier = new Modifier();
    modifier.setModifier(new BigDecimal(".90"));
    em.persist(modifier);

    Order order = new Order();
    em.persist(order);

    OrderProductModifier opm = new OrderProductModifier();
    opm.setId(new OrderProductModifierId());
    opm.setOrder(order);
    opm.setProduct(product);
    opm.setModifier(modifier);
    em.persist(opm);
    
    em.getTransaction().commit();

    em.clear();

    Order o = em.createQuery("select o from Order o join fetch o.products where o.id = 1", Order.class).getSingleResult();
    System.out.println("Order for " + o.getProducts());
    System.out.println("Order cost " + o.getProducts().stream().map(p->p.getProduct().getUnitPrice().multiply(p.getModifier().getModifier()).doubleValue()).collect(Collectors.summingDouble(Double::doubleValue)));

}