gpt4 book ai didi

java - 如何在不出现 "could not initialize proxy - no Session"异常的情况下获取数据

转载 作者:行者123 更新时间:2023-12-01 13:41:47 24 4
gpt4 key购买 nike

我有一种从数据库检索数据的方法:

public static List<ClassA> getAll() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(ClassA.class);
List result = criteria.list();
tx.commit();
return result;
} catch (HibernateException ex) {
transactionRollBack(tx);
log.error(ex.getMessage());
} finally {
session.close();
}
return null;
}

使用示例:

List<ClassA> results = getAll();
for (ClassA result : results) {
System.out.println(result); //"could not initialize proxy - no Session" is thrown here
}

如果我正确理解了 Hibernate 文档,就会发生这种情况,因为 session 已关闭。但是我如何获取数据并关闭 session (因为它需要在一分钟内即将开始的下一个事务之前关闭)?

已更新

这是 ClassA 内容,包括 toString():

@Entity
@Table(name = "classA")
public class ClassA implements Serializable {

private static final long serialVersionUID = 5163856045361200311L;
private int id;
private String name;

private Set<ClassB> classB = new HashSet<ClassB>(0);

public ClassA() {}
public ClassA(int id, String name) {
this.id = id;
this.name = name;
}

public ClassA(String name) {
this.name = name;
}

public ClassA(ClassA classA) {
this.id = classA.getId();
this.name = classA.getName();
}

@Id
@GeneratedValue(strategy = AUTO)
@Column(name = "id", nullable = false, unique = true)
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@Column(name = "name")
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@OneToMany(fetch = LAZY, mappedBy = "classA_id")
public Set<ClassB> getClassB() {
return classB;
}

public void setClassB(Set<ClassB> classB) {
this.classB = classB;
}

@Override
public String toString() {
return "ClassA{ id=" + id + ", name='" + name + ", classB =" + classB + '}';
}
}

问题似乎出在 ClassB 上,但我不明白它是什么。这是B类:

@Entity
@Table(name = "classB")
public class ClassB implements Serializable{

private static final long serialVersionUID = -8481028941663340911L;
private int id;
private Date date;
private ClassA classA_id;
private int classA_counter;

public ClassB() {}

public ClassB(ClassB rec) {
this.id = rec.getId();
this.date = rec.getDate();
this.classA_id = rec.getClassA_id();
this.classA_counter = rec.classA_counter();
}

@Id
@GeneratedValue
@Column(name = "id", nullable = false)
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@Temporal(DATE)
@Column(name = "date")
public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "classA_id", nullable = false)
public ClassA getCLassA_id() {
return classA_id;
}

public void setClassA_id(ClassA classA_id) {
this.classA_id = classA_id;
}

@Column(name = "classA_counter", columnDefinition = "int default 0")
public int getClassA_counter() {
return classA_counter;
}

public void setClassA_counter(int classA_counter) {
this.classA_counter = classA_counter;
}

@Override
public String toString() {
return "ClassB { id=" + id + ", date=" + date + ", classA_id=" + classA_id.getName() + ", classA_counter=" + classA_counter +'}';
}
}

最佳答案

问题在于 toString() 方法,该方法由

隐式调用
System.out.println(result);

尝试访问尚未由 getAll() 方法加载的 ClassA 实体的关联。修复 toString) 方法,使其仅访问保证存在的数据。

如果您确实需要在 session 关闭后访问某些关联,请确保已通过查询或调用 Hibernate.initialize(classAInstance.getAssociationThatMustBeLoaded()) 加载此关联.

关于java - 如何在不出现 "could not initialize proxy - no Session"异常的情况下获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20686428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com