【问题标题】:Get data in a many-to-many connection在多对多连接中获取数据
【发布时间】:2014-07-08 16:12:51
【问题描述】:

我的休眠数据库连接出现问题。首先我发布一些数据:

Objects.java:

@Entity
@Table (name = "objects", schema="genmeta")
public class Objects {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int o_id;
    private String o_name;
    private String o_desc;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "genmeta.object_tg_assc", joinColumns = { @JoinColumn(name = "o_id") }, inverseJoinColumns = { @JoinColumn(name = "tg_id") })
    private Set<TemplateGroup> templateGroups;
    @Transient
    private boolean templateGroupsLoaded = false;

    /**
     * Getters and Setters 
     */
}

模板组.java:

public class TemplateGroup {
    @Id
    @Column(unique=true, nullable=false)
    private int tg_id;
    private String tg_name;
    private String tg_desc;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "templateGroups")
    private Set<Objects> objects;

    /**
     * Getters and Setters 
     */
}

我的问题是,我以后如何从我的类 Object 中获取数据?

这是我的第一次尝试: 代码示例:

public Set<TemplateGroup> loadTemplateGroups(Objects myObjects) {
    Session session = factory.openSession();
    Set<TemplateGroup> myTG = myObjects.getTemplateGroups();
    session.close();
    return myTG;
}

非常感谢。

最好的问候 比约恩

【问题讨论】:

  • 您不需要显式检索 TemplateGroup 列表。当您从Objects 实例访问templateGroups 集时,hibernate 将触发基于映射的查询并使用正确的数据填充列表。你得到的是一个空集吗?
  • 是的。因为这个 Set 我想,我必须像这样加载数据。你知道我的另一种方式吗?
  • 当您访问templateGroups时,您必须启用hibernate sql logging并检查hibernate生成和记录的SQL。
  • 你有我的例子吗?不知道你的意思。每个人都说:“当您访问 templateGroups 时”。怎么样?
  • 如果你做一个简单的object.getTemplateGroups(),hibernate 会触发一个查询来获取集合的内容。在休眠配置文件中,您可以启用 sql 日志记录。例如,&lt;property name="show_sql"&gt;true&lt;/property&gt;。查看此链接了解更多详情,stackoverflow.com/questions/2536829/hibernate-show-real-sql

标签: java database hibernate many-to-many


【解决方案1】:

抛出failed to lazily initialize a collection of role: db.hibernate.classes.Objects.templateGroups, could not initialize proxy - no Session 异常是因为您在一个事务中检索Objects 实例并在另一个事务中调用getTemplateGroups()(或在提交第一个事务之后)。您不应打开另一个会话来获取模板组。

您需要执行以下操作:

Session session = factory.openSession();
Objects object = <Code to retrieve the Objects instance>
Set<TemplateGroup> templateGroups = object.getTemplateGroups();
templateGroups.size(); // as an example
session.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多