在 "child" class 上使用 toString,其中 "parent" 是 Hiberneate/JPA class

using toString on a "child" class where the "parent" is a Hiberneate/JPA class

我正在使用 REST API、Java、Hibernate 和 JPA。

我有一个 class Ms​​trgetnroletype(即角色类型),它是另一个 class 的一部分,叫做 ApplicationUser。

class 应用程序用户

@Entity
@Table(name = "APPLICATIONUSER", schema = "orcl", uniqueConstraints = { @UniqueConstraint(columnNames = "EMAIL"),
        @UniqueConstraint(columnNames = "USERNAME") })
public class ApplicationUser implements java.io.Serializable {

    private BigDecimal id;
    private Mstrgenroletype mstrgenroletype;
    private Mstrgenyesno mstrgenyesnoByIsactive;
    private Mstrgenyesno mstrgenyesnoByIsstaff;
    private Mstrgenyesno mstrgenyesnoByIssuperuser;

[.. snip ..]

class Mstrgenroletype

@Entity
@Table(name = "MSTRGENROLETYPE", schema = "orcl")
public class Mstrgenroletype implements java.io.Serializable {

    private BigDecimal mstrgenroletypeid;
    private String langid;
    private String shortdesc;
    private String longdesc;
    private Set<Applicationuser> applicationusers = new HashSet<Applicationuser>(0);

    public Mstrgenroletype() {
    }

    public Mstrgenroletype(BigDecimal mstrgenroletypeid) {
        this.mstrgenroletypeid = mstrgenroletypeid;
    }

    public Mstrgenroletype(BigDecimal mstrgenroletypeid, String langid, String shortdesc, String longdesc,
            Set<Applicationuser> applicationusers) {
        this.mstrgenroletypeid = mstrgenroletypeid;
        this.langid = langid;
        this.shortdesc = shortdesc;
        this.longdesc = longdesc;
        this.applicationusers = applicationusers;
    }

    @Id

    @Column(name = "MSTRGENROLETYPEID", unique = true, nullable = false, precision = 22, scale = 0)
    public BigDecimal getMstrgenroletypeid() {
        return this.mstrgenroletypeid;
    }

    public void setMstrgenroletypeid(BigDecimal mstrgenroletypeid) {
        this.mstrgenroletypeid = mstrgenroletypeid;
    }

    @Column(name = "LANGID", length = 2)
    public String getLangid() {
        return this.langid;
    }

    public void setLangid(String langid) {
        this.langid = langid;
    }

    @Column(name = "SHORTDESC", length = 10)
    public String getShortdesc() {
        return this.shortdesc;
    }

    public void setShortdesc(String shortdesc) {
        this.shortdesc = shortdesc;
    }

    @Column(name = "LONGDESC", length = 20)
    public String getLongdesc() {
        return this.longdesc;
    }

    public void setLongdesc(String longdesc) {
        this.longdesc = longdesc;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "mstrgenroletype")
    public Set<Applicationuser> getApplicationusers() {
        return this.applicationusers;
    }

    public void setApplicationusers(Set<Applicationuser> applicationusers) {
        this.applicationusers = applicationusers;
    }

    @Override
    public String toString() {
        return "Mstrgenroletype [mstrgenroletypeid=" + mstrgenroletypeid + ", langid=" + langid + ", shortdesc="
                + shortdesc + ", longdesc=" + longdesc + "]";
    }

}

我正在尝试制作一个 "toString" 的方法,它将打印出与 ApplicationUser 关联的变量的内容.

问题是当打印出与 Ms​​trgenroletype 关联的变量的内容时,我得到一个错误

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

这是因为它试图打印与 Ms​​trgenroletype 的 class 关联的内容。(我知道这一点是因为当我删除与变量关联的打印语句时链接到 class,一切正常)

之前(得到错误)

@Override
    public String toString() {
        return "ApplicationUser [id=" + id +  ", password=" + password + ", username=" + ", role=" + mstrgenroletype.toString() 
        + username + ", firstname=" + firstname + ", lastname=" + lastname + ", email=" + email + ", userid="
        + userid + ", apptenantid=" + apptenantid + ", appkeyid=" + appkeyid + ", profilepic=" + profilepic +  "]";     

    }

AFTER(删除了 Mstrgenroltype 变量,没有出现错误)

@Override
    public String toString() {
        return "ApplicationUser [id=" + id +  ", password=" + password + ", username=" 
        + userid + ", apptenantid=" + apptenantid + ", appkeyid=" + appkeyid + ", profilepic=" + profilepic +  "]";     

    }

我已经确定 class 和 Ms​​trgenroletype 也有一个 toString 方法。

如何打印与 Mstrgenroletype 关联的变量?

您在未立即加载 mstrgenroletype 关系的 ApplicationUser 对象上调用 toString() 方法。
ApplicationUser.toString()方法调用mstrgenroletype引用的对象的toString()方法时抛出异常,因为ApplicationUser对象当前是一个Hibernate代理,只能在Hibernate 会话的框架。
但是根据抛出的异常,您在 toString() 调用期间没有任何当前打开的会话。

How can I print the variable associated with Mstrgenroletype?

首先,您应该避免 toString() 结果取决于持久性会话。
它混合了东西。 toString() 用于调试对象,而不是用于通过查询执行获取字段。
这是您必须避免的重要副作用。
因此,我建议编写一个 toString() 方法,该方法仅依赖于实体自己的字段,就像您在解决方法中所写的那样。
equals()hashCode() 方法也应遵循此规则

当然,如果您在功能上需要检索关系,请使用提取连接将其添加到您的查询中。
如果不是这种情况并且您只想调试对象关系,则可以在 class 中的 IDE 中添加一个断点,其中打开 Hibernate 会话并检索对象并深入研究与IDE 工具(Eclipse 中的显示或执行功能)。