繁体   English   中英

如何在Spring Data中实现包含两个相同类型的实体列表的实体

How to implement an entity containing two lists of entities of the same type in Spring Data

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有实体订单。 它包含玻璃零件清单和非玻璃零件清单。 零件是具有属性PartType(玻璃/非玻璃)的单个实体。 请问这对Spring Data可行吗? 怎么样? 我正在将Spring Boot 1.3.1.RELEASE与Hibernate一起使用。

@Entity
@Table(name="order")
public class Order {

    ...

    @OneToMany(...)
    private List<Part> glassParts;

    @OneToMany(...)
    private List<Part> otherParts;
}

@Entity
@Table(name="part")
public class Part {

  ...

  @Column(...)
  private PartType partType;

  @Column(...)
  private String code;

  @Column(...)
  private String description;
}
1 个回复

我相信在您的情况下,创建两个列表不是一个好主意。 为了获得结果,有两种常用方法。 第一个是创建双向关系,并在适当的条件下实现存储库和管理器层:

@Entity
@Table(name="order")
public class Order {

    ...

    @OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = { ... })
    private List<Part> parts;
}

@Entity
@Table(name="part")
public class Part {

  ...

  @JoinColumn(name = "r_order_id", referencedColumnName = "id")
  @ManyToOne(...)  
  private Order order;
  @Column(...)
  private PartType partType;

  @Column(...)
  private String code;

  @Column(...)
  private String description;
}

public interface PartInterface implements CrudRepository<Part, Long> {

  List<Part> findByOrderIdAndPartType(Long orderId, PartType partType);
}

@Component
public class PartManager {

  @Autowired
  private PartInterface partInterface;

  public List<Part> getGlassPartsByOrderId(Long orderId) {
    return List<Part> partInterface.findByOrderIdAndPartType(orderId, PartType.GLASS);
  }

  public List<Part> getNonGlassPartsByOrderId(Long orderId) {
    return List<Part> partInterface.findByOrderIdAndPartType(orderId, PartType.NON_GLASS);
  }
}

第二个是按类型过滤订单的所有部分:

public interface OrderInterface implements CrudRepository<Order, Long> {

  @Override
  Order findOne(Long orderId);
}

@Component
public class OrderManager {

  @Autowired
  private OrderInterface orderInterface;

  public List<Part> getGlassPartsByOrderId(Long orderId) {    
    return getOrderParts(orderId).stream().filter(part -> Objects.equals(PartType.GLASS, part.getPartType())).collect(Collectors.toList());    
  }

  public List<Part> getNonGlassPartsByOrderId(Long orderId) {
    return getOrderParts(orderId).stream().filter(part -> Objects.equals(PartType.NON_GLASS, part.getPartType())).collect(Collectors.toList());    
  }

  private List<Part> getOrderParts(Long orderId) {
    Order order = orderInterface.findOne(Long orderId);
    if (Objects.isNull(order) || Objects.isNull(order.getParts())) {
      return Collections.emptyList();
    } else {
      return order.getParts();
    }
  }
}

实际上,还有另一种选择-动态过滤实体内部的零件:

@Entity
@Table(name="order")
public class Order {

    @OneToMany(...)
    private List<Part> parts;

    public List<Part> getGlassParts{
      if (Objects.nonNull(parts)) {
        return parts.stream().filter(part -> Objects.equals(PartType.GLASS, part.getPartType())).collect(Collectors.toList());
      } else {
        return Collections.emptyList();
      }
    }

    public List<Part> getNonGlassParts{
      if (Objects.nonNull(parts)) {
        return parts.stream().filter(part -> Objects.equals(PartType.NON_GLASS, part.getPartType())).collect(Collectors.toList());
      } else {
        return Collections.emptyList();
      }
    }
}

更新由于您使用的是Hibernate因此有一个依赖ORM的选项来获得所需的结果,它是一个@JoinColumnOrFormula批注,仅可用于Hibernate

@Entity
@Table(name="order")
public class Order {

    @OneToMany(...)
    @JoinColumnOrFormula(
      column = @JoinColumn(name = "id", referencedColumnName = "r_order_id", insertable = false, updatable = false)
      ,formula = @JoinFormula(value = PartType.GLASS_STR_VALUE, referencedColumnName = "partType"))
    private List<Part> glassParts;

    @OneToMany(...)
    @JoinColumnOrFormula(
      column = @JoinColumn(name = "id", referencedColumnName = "r_order_id", insertable = false, updatable = false)
      ,formula = @JoinFormula(value = PartType.NON_GLASS_STR_VALUE, referencedColumnName = "partType"))
    private List<Part> nonGlassParts;    
}

请注意@JoinFormula子句中的value参数必须为String

2 在同一实体中连接两个相同类型的对象

我需要一种在同一实体中关联相同类型的两个对象的方法。 我有这个课: 和这个班: 当我使用1对1关联时,将获得Link实体中的导航属性和EndPoint实体中的两个导航属性,这是一个链接对象。 如何让EndPoint实体仅使用一个Link对象? 对这种设计有什么建议吗? ...

3 表格中两个相同类型的实体字段的格式不同

我正在使用带有实体类的JPA容器从MySQL填充表。 其中两个字段是GregorianCalendar字段(一个是日期,一个是时间),我正在寻找一种单独格式化/转换它们的方式,以便日期显示为短日期(例如dd-MM-yyyy),并且显示时间根据语言环境在24小时内缩短(HH:mm)。 根据 ...

4 一个实体可以包含两个唯一可访问的相同类型的不同实体吗?

暂时忘记数据库和表。 说我有一类Spaceship和一类Person 。 如果我正在编写Contract模型,则可以这样做: 因为队长和工程师都是人,虽然他们的相关信息可能略有不同,但是如果他们是同一类型,他们将保持最大的干燥状态。 但是,如果我想在实体框架中建立这种关系怎么办 ...

5 NHibernate-同一实体中具有相同类型的两个列表

我有一个我想映射的课程: 带有映射: 其中权是代表某些权的两个不同势系统有另外一个映射类(它可以像“GetPartStockQuantity”或“GetOrderStatus”)。 我遇到的问题是,当我向两个列表中的每一个添加一个权限,然后使用NHibernate将它们添加 ...

8 如何在相同类型的实体中具有多个列表?

我有一个实体,需要另一个实体的多个列表。 这些列表中的每一个都将由相同类型的实体组成,但这似乎使框架感到困惑。 我读过这个问题: 实体框架中相同类型的多个集合 并遵循通过为每个项目列表继承不同类型来区分不同列表的建议。 不过,这似乎没有任何作用。 我得到的错误是: E ...

9 找出两个相同类型的实体之间的差异

我正在开发一个mvc3网络应用程序。 当用户更新某些内容时,我想将旧数据与用户输入的新数据进行比较,并将每个不同的字段添加到日志中以创建活动日志。 现在这是我的保存动作: 我发现我可以用它来遍历我的oldCompLang属性: 但这并没有真正帮助,因为它只显示属性(Id, ...

10 具有两个相同类型字段的JPA实体

我试图在我的实体中使用同一域类的2个字段,但出现此错误: org.hibernate.MappingException:无法确定以下类型:com.packt.webapp.domain.User,在表:意见,针对列:[org.hibernate.mapping.Column(autho ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM