在 "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 Mstrgetnroletype(即角色类型),它是另一个 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 关联的变量的内容.
问题是当打印出与 Mstrgenroletype 关联的变量的内容时,我得到一个错误
org.hibernate.LazyInitializationException: could not initialize proxy
- no Session
这是因为它试图打印与 Mstrgenroletype 的 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 和 Mstrgenroletype 也有一个 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 中的显示或执行功能)。
我正在使用 REST API、Java、Hibernate 和 JPA。
我有一个 class Mstrgetnroletype(即角色类型),它是另一个 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 关联的变量的内容.
问题是当打印出与 Mstrgenroletype 关联的变量的内容时,我得到一个错误
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这是因为它试图打印与 Mstrgenroletype 的 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 和 Mstrgenroletype 也有一个 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 中的显示或执行功能)。