当前位置: 首页 > 知识库问答 >
问题:

命名实体图子图

笪智志
2023-03-14

我是JPA 2.1的新手,最近才开始使用命名实体图。对于我的项目,我正在JPA 2.1中映射以下关系:

顺序

我想指示JPA加入并正确获取所有需要的数据。到目前为止,这对订单来说完美无缺 -

以下是我的实体(省略了getter和setter):

次序

@Entity
@Table(name="ORDERS")
@NamedEntityGraph(
    name = "graph.Order.details",
    attributeNodes = {
        @NamedAttributeNode(value = "details", subgraph = "graph.OrderDetail.product")
    },
    subgraphs = {
        @NamedSubgraph(name = "graph.OrderDetail.product", attributeNodes = @NamedAttributeNode("product"))
    }
)

public class Order implements Serializable{
  @Id
  @Column(name = "orderNumber")
  private Long number;

  @Column(name = "orderDate")
  private Date date;

  @OneToMany(mappedBy = "order")
  private List<OrderDetail> details;
}

订单明细

@Entity
@Table(name = "orderdetails")
public class OrderDetail implements Serializable{

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "orderNumber")
   @Id
   private Order order;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "productCode", nullable = false)
   @Id
   private Product product;

   @Column(name = "orderLineNumber")
   private int lineNumber;

   @Column(name = "quantityOrdered")
   private int quantity;

产品

@Entity
@Table(name = "products")
class Product {
    @Column(name = "productCode")
    @Id
    private String code;

    @Column(name = "quantityInStock")
    public int quantity;

    @ManyToOne
    @JoinColumn(name = "productLine")
    private ProductLine line;

产品线

@Entity
@Table(name = "productlines")
public class ProductLine {
    @Id
    @Column(name = "productLine")
    private String line;

    @Column
    private String textDescription;

共有3个答案

方河
2023-03-14

每个<code>namedAttribute节点。

@Entity
@Table(name="ORDERS")
@NamedEntityGraph(
    name = "graph.Order.details",
    attributeNodes = {
        @NamedAttributeNode(value = "details", subgraph = "graph.OrderDetail.product")
    },
    subgraphs = {
        @NamedSubgraph(name = "graph.OrderDetail.product", attributeNodes = @NamedAttributeNode(value = "product", subgraph = "graph.Product.productLine")),
        @NamedSubgraph(name = "graph.Product.productLine", attributeNodes = @NamedAttributeNode("line"))
    }
)
阚小云
2023-03-14

您可以使用动态实体图创建多级实体图。我正在使用jpa 2.2和Hibernate 5.3.7,我能够创建实体图并获取高达3级的数据。我希望这对下一关也有用。下面是代码片段。有关更多详细信息和实际代码,您可以查看我的github repo:https://github . com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/Java/com/katariasoft/technologies/jpaHibernate/entity/fetch/entity graph/dynamic/multi instructorsdynamicetygrpahtests . Java

代码段:

@SuppressWarnings("unchecked")
    @Test
    @Rollback(false)
    public void fetchInstrctrsIdProofVehiclesStudentsTheirInstructorsVehiclesAndTheirDocuments() {
        doInTransaction(() -> {
            EntityGraph<Instructor> instructorGraph = em.createEntityGraph(Instructor.class);
            instructorGraph.addAttributeNodes(Instructor_.idProof, Instructor_.vehicles);
            Subgraph<Student> studentSubgraph = instructorGraph.addSubgraph(Instructor_.STUDENTS);
            studentSubgraph.addAttributeNodes(Student_.instructors);
            Subgraph<Vehicle> vehicleSubgraph = studentSubgraph.addSubgraph(Student_.VEHICLES);
            vehicleSubgraph.addAttributeNodes(Vehicle_.documents);
            TypedQuery<Instructor> query = em.createQuery("select i from Instructor i ", Instructor.class)
                    .setHint(EntityGraphUtils.FETCH_GRAPH, instructorGraph);
            List<Instructor> instructors = query.getResultList();
            if (Objects.nonNull(instructors))
                instructors.forEach(instructor -> {
                    IdProof idProof = instructor.getIdProof();
                    Set<Vehicle> vehicles = instructor.getVehicles();
                    Set<Student> students = instructor.getStudents();
                    System.out.println(instructor);
                    System.out.println(idProof);
                    if (Objects.nonNull(vehicles))
                        vehicles.forEach(v -> System.out.println(v.getVehicleNumber()));
                    if (Objects.nonNull(students))
                        students.forEach(s -> System.out.println(s.getName()));
                });
        });
    }
彭坚壁
2023-03-14

简单的答案是,你不能这样做,因为使用当前的JPA实现,你最终会做两个单独的查询,并且不得不处理笛卡尔积。JPA的一些未来版本可以扩展为包括更多级别的子图,但就目前而言,它没有。有一个 JPA SPEC 组适用于下一版本的 JPA。请随时在那里提交您的请求/建议。

在StackOverflow上有另一个相同问题的参考。

 类似资料:
  • 问题内容: 我是JPA 2.1的新手,仅开始使用最近命名的实体图。对于我的项目,我正在JPA 2.1中映射以下关系: 订单- > OrderDetail->产品-> ProductLine 我想指示JPA加入并正确获取所有需要的数据。到目前为止,这对于 Order- > OrderDetail-> Product来说 是完美的,但是到目前为止,我还没有添加一个Sub-Sub Graph来深入到Pr

  • 我最近发现了命名实体图,我正试图以一种干净、干燥的方式实现它们。 我不确定的是(通过JPA和Spring数据文档阅读还没有回答)使用的名称的范围。是它们所定义的类的私有,还是我可以这样做: 车站在哪里。Route中的深子图是指Stop中的命名实体图。 谢谢!

  • 问题内容: 我正在寻找Java的简单但“足够好”的命名实体识别库(和字典),我正在处理电子邮件和文档并提取一些“基本信息”,例如:名称,地点,地址和日期 我一直在环顾四周,大多数似乎都是沉重的一面和完整的NLP项目。 有什么建议吗? 问题答案: 顺便说一句,我最近遇到了OpenCalais,它似乎具有我要照顾的功能。

  • 问题内容: 我在应用程序引擎中使用Alchemy API,所以在使用simplejson库来解析响应。问题是响应中包含具有sme名称的条目 因此,问题在于重复了“ subType”,因此加载返回的指令只是“ TVActor”,而不是列表。无论如何要解决这个问题? 问题答案: 定义的RFC 4627 表示: 和: 这意味着AlchemyAPI不应在同一个对象内返回多个名称,并声称它是JSON。 您可

  • 我不熟悉elasticsearch。我正在探索从elasticsearch中的内容和索引中提取实体的可能性。我尝试在elasticsearch中安装并映射openNLP插件,但遇到了诸如找不到处理程序类等问题。我尝试使用maven构建openNLP插件,但无法实现最终目标。 elasticsearch中是否有其他插件可用于命名实体提取?如果用户不使用插件,可以使用任何其他方式执行NER和索引到ES

  • 我想使用NLP工具从意大利文本中提取名称和数字。 遗憾的是,斯坦福德NLP和Apache OpenNLP都没有为意大利人提供模型。 我能找到一个,或者找到训练数据来制造一个吗?(至少15000句)