我正在使用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 相关联的变量?
答案 0 :(得分:1)
您在toString()
对象上调用ApplicationUser
方法,该方法未热切加载mstrgenroletype
关系。
当ApplicationUser.toString()
方法调用toString()
引用的对象的mstrgenroletype
方法时,它会抛出异常,因为ApplicationUser
对象当前是一个Hibernate代理,只能在Hibernate会话的框架
但根据抛出的异常,您在toString()
调用期间没有任何当前打开的会话。
如何打印与Mstrgenroletype相关联的变量?
首先,你应该避免使用toString()
,结果取决于持久性会话
它混合了一些东西toString()
用于调试对象,而不是用于获取查询执行的字段
这是必须避免的重要副作用
因此,我建议编写一个toString()
方法,该方法仅依赖于您在解决方法中编写的实体的自己的字段。
equals()
或hashCode()
方法
当然,如果您需要在功能上检索关系,请使用获取联接将其添加到查询中 如果不是这种情况并且您只想调试对象关系,则可以在IDE中在打开Hibernate会话并检索对象的类中添加断点,并深入了解与IDE工具的关系(显示或执行功能)蚀)。