【问题标题】:JPA - Entity with One-to-many - relationship returns no dataJPA - 具有一对多关系的实体 - 关系不返回数据
【发布时间】:2012-09-29 13:13:21
【问题描述】:

我正在使用 ReverseMappingTool 为现有的数据库方案创建 JPA 源。

它工作正常,有一个例外:创建后,从一对多关系调用get-Methods数据时没有加载。

JPA 文件如下所示:

@Entity
@Table(schema="myScheme", name="ORDER")
@IdClass(org.company.OrderId.class)
public class Order {
    @OneToMany(targetEntity=org.company.Orderposition.class, mappedBy="order", cascade=CascadeType.MERGE)
    private Set orderpositions = new HashSet();

public Set getOrderpositions() {
    return bestellpositions;
}

public void setOrderpositions(Set orderpositions) {
    this.orderpositions = orderpositions;
}

public Set getDependantPositions() {
    if (getOrderpositions() != null) {
        return getOrderpositions();
    }
}

还有……

@Entity
@Table(schema="myScheme", name="ORDERPOSITION")
@IdClass(org.company.Orderposition.Id.class)
public class Orderposition {
    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
    @JoinColumn(name="intid_strbestellung", nullable=false)
    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

“getDependantPositions()”方法只是我在 JPA 类中放置的方法的一个示例。有必要这样做,所以让我们把它当作给定的。关键是,尽管数据库包含该对象的大量条目,但调用 getOrderpositions() 不会返回任何数据。映射工具没有为 @OneToMany-Relationships 添加任何 FetchType...所以我猜它的 LAZY 并调用 getOrderpositions() 应该返回所有相关值。

你能帮帮我吗?

谢谢!

P.S.:这就是我调用 ReverseMappingTool 的方式:

Options opts = new Options();
        // Output directory - All generated code and metadata will be written to the directory at this path
        opts.setProperty("directory", PATH_SOURCEGENERATION);
        // True to generate JPA annotations in generated java classes. 
        opts.setProperty("annotations", true);
        // disable orm.xml generation
        opts.setProperty("metadata", "none");
        // The full class name of a org.apache.openjpa.jdbc.meta.ReverseCustomizer customization plugin
        opts.setProperty("customizerClass", JPAPropertiesReverseCustomizer.name);
        // Create built-in application identity classes if possible
        opts.setProperty("useBuiltinIdentityClass", false);
        // Avoid creating classes for many-many join tables
        opts.setProperty("primaryKeyOnJoin", true);
        // Prevent the creation of inverse 1-many/1-1 relations for every many-1/1-1 relation detected
        opts.setProperty("inverseRelations", true);

        opts.setProperty("innerIdentityClasses", true);

【问题讨论】:

  • 您的代码无法编译。请修复问题,以便我们可以专注于实际代码。此外,测试 toManyAssociation 是否为 null 将始终返回 false。如果没有关联实体,则该集合将为空,并且不为空。请向我们展示无法按预期工作的代码以及表格中的相关数据。最后,为什么不使用泛型类型?
  • 嗨 JB Nizet...我稍微更改了代码以将其发布在这里..将名称从德语更改为英语等。文件编译良好。 getDependantPositions() 方法也是一个例子……它通常调用 OnetoMany 属性的 Get-Method……我将添加泛型……感谢您提供的信息……

标签: java jpa entity one-to-many openjpa


【解决方案1】:

默认情况下,OneToMany Fetch Type 是 Lazy。如果你想加载这些数据,你必须使用 JPQL 语句

SELECT t FROM TABLE t JOIN FETCH t.joinedTable

或者你在 OneToMany 映射中到处指定 FetchType.EAGER。但这意味着关系总是被加载。

另请参阅:http://openjpa.apache.org/builds/1.1.0/docs/jpa_langref.html#jpa_langref_fetch_joins

塞巴斯蒂安

【讨论】:

  • 嗨塞巴斯蒂安......我认为 LAZY - fetchtype 的意思是:第一次调用时加载......例如获取订单位置()。我真的必须使用 JPQL 来获取数据吗?
  • 你说得对,我的建议与你想强制加载的时间有关。但是,您可能会强制它查看是否完全加载了订单位置或是否存在映射问题。
【解决方案2】:

您应该配置日志,以便查看发送到数据库的查询。然后您将能够检查:1. 当 Order 加载时,什么查询进入 DB 以及 2. 当您获得 getOrderpositions() 返回的 Set 内容时,什么(如果有)查询进入 DB。请注意,您必须访问 Set 的内容,仅调用 getter 不会在延迟加载关联中调用任何 DB 查询。

【讨论】:

  • 嗨,亚当,我调用了 getter,并尝试通过调用集合的迭代器等来访问元素。但它一直是空的。还是我必须使用属性本身?
  • @Randbedingung 您需要遍历集合。日志呢?如果配置正确,它们会显示 ORM 发送到 DB 的确切查询,并验证 JPA 是否正在执行您的预期。
  • Sooooo... 终于成功了。我通过更改 OpenJpaVendorAdapter (Spring) 中的“showSql”属性来设置调试方式。它没有效果,没有显示sql查询。然后我意识到我用自己的类加载器实例化了 JPA 类。我能够实例化它,但没有“托管” JPa 类。我的错误是没有通过 LocalContainerEntityManagerFactoryBean 加载类。改变了它,一切都很好:-) 谢谢大家!
  • 嗨@Randbedingung,您能否详细说明您的答案,我遇到了同样的问题,但还没有找到解决方法。 stackoverflow.com/q/17125641/866390 这是问题所在。谢谢。
猜你喜欢
  • 2013-04-25
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2014-04-28
  • 2021-05-25
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多