我在尝试在 Java 应用程序中使用 Hibernate 持久保存实体时遇到问题。我有一个简单的设置,其中实体类使用 JPA 注释进行注释,并配置了 Hibernate 会话工厂。但是,当我尝试使用会话的
save()
方法保存实体时,我始终遇到 NullPointerException
。这是我的代码的简化版本
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class Main {
private static SessionFactory factory;
public static void main(String[] args) {
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Failed to create session factory: " + ex);
throw new ExceptionInInitializerError(ex);
}
Session session = factory.openSession();
session.beginTransaction();
// Create and persist a new entity
MyEntity entity = new MyEntity();
entity.setName("Test Entity");
session.save(entity); // NullPointerException occurs here
session.getTransaction().commit();
session.close();
}
}
这是实体类MyEntity
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
我已经仔细检查了我的 Hibernate 配置和实体映射,但我似乎无法弄清楚为什么会发生这种情况。任何见解或建议将不胜感激。
就您而言,出现问题是因为您在会话关闭后尝试使用该会话。当您在提交事务后调用 session.close() 时,会话将被有效终止,并且对其进行的任何后续操作都将导致 NullPointerException。
要解决此问题,您需要确保在打开的会话范围内执行所有必要的操作。实现此目的的一种方法是将事务块移动到 try-with-resources 语句内,该语句在完成后自动关闭会话:
NullPointerException
}
通过将会话封装在 try-with-resources 块中,您可以确保在不再需要时正确关闭它,从而防止任何潜在的 NullPointerExceptions。确保在 catch 块内正确处理任何异常。