java - 在 "child"类上使用 toString,其中 "parent"是 Hiberneate/JPA 类

标签 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: could not initialize proxy - no Session

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

之前(出现错误)

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

    }

之后(Mstrgenroltype 变量已删除,没有错误)

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

    }

我已经确保具有 Mstrgenroletype 的类也有一个 toString 方法。

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

最佳答案

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

How can I print the variable associated with Mstrgenroletype?

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

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

关于java - 在 "child"类上使用 toString,其中 "parent"是 Hiberneate/JPA 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48506867/

相关文章:

java - 尝试创建新的 JarFile 时出现 "java.util.zip.ZipException: error in opening zip file"

java - Hibernate @Filter注解的使用

java - 与共享 id 的一对一关系要求子级了解父级

java - "Errors in named queries: User.findByUserNameAndPassword "- 无法解决

java - IBM DB2 9.7 错误代码 840,select 语句列表太大

java - 删除与另一个对象有manyTomany关系的对象

java - em.persist() JPA 中需要父实体对象

java - 在 JAX-WS 中更改 SOAPRequest 前缀

Java - 使 jCheckBox 不可选中,反之亦然,而不禁用它

java - 必须单击 "Submit"按钮两次才能提交表单