在“child”类上使用toString,其中“parent”是Hiberneate / JPA类

时间:2018-01-29 17:31:25

标签: java hibernate jpa tostring

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

我有一个类 Mstrgetnroletype(即角色类型),它是另一个名为 ApplicationUser的类的一部分。

类ApplicationUser

@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 ..]

类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 相关联的变量的内容。

问题是当打印出与 Mstrgenroletype 相关联的变量的内容时,我收到错误

  

org.hibernate.LazyInitializationException:无法初始化代理    - 没有会话

这是因为它正在尝试打印与 Mstrgenroletype类相关联的内容。(我知道这是因为当我删除与链接到该类的变量关联的print语句时,一切正常)

之前(得到错误)

@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 +  "]";     

    }

我确保 Mstrgenroletype 的类也有toString 方法。

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

1 个答案:

答案 0 :(得分:1)

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

  

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

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

也应遵循此规则

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