Java 在hibernate中加载相关对象

Java 在hibernate中加载相关对象,java,mysql,hibernate,proxy,many-to-one,Java,Mysql,Hibernate,Proxy,Many To One,我想加载具有多对一字段类型的House对象: @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name="type_id") public Type getType() { return type; } 我现在想这样访问它: House temp = DataBaseConnector.getInstance().findHouseByID(id); Type type = temp.getType(); findHouseById()方法

我想加载具有多对一字段类型的House对象:

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="type_id")
public Type getType() {
    return type;
}
我现在想这样访问它:

House temp = DataBaseConnector.getInstance().findHouseByID(id);
Type type = temp.getType();
findHouseById()
方法如下所示:

public static House findHouseByID(Integer id) {
    Session session = getSessionFactory().openSession();
    House e = (House) session.load(House.class, id);
    session.close();
    return e;
}
但我犯了一个错误:

线程“AWT-EventQueue-0”中出现异常 org.hibernate.LazyInitializationException:无法初始化代理 -org.hibernate.proxy.AbstractLazyInitializer.initialize上没有会话(AbstractLazyInitializer.java:165) 在 org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286) 在 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) 在mapping.House\u$$\ ujvst2a0\u3.getType(House\u$\ ujvst2a0\u3.java)

类型实体:

package mapping;

import java.util.List;

import javax.persistence.*;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name="Type")
public class Type {

    private int type_id;
    private String name;
    private List <Account> accounts;
    private List <House> houses;

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

    public Type()
    {

    }

    @Id
    @GeneratedValue
    @Column(name="id")
    public int getType_id() {
        return type_id;
    }

    public void setType_id(int type_id) {
        this.type_id = type_id;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @Fetch(FetchMode.JOIN)
    @OneToMany(mappedBy="type")
    public List <Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List <Account> accounts) {
        this.accounts = accounts;
    }
    @Fetch(FetchMode.JOIN)
    @OneToMany(mappedBy="type")
    public List <House> getHouses() {
        return houses;
    }

    public void setHouses(List <House> houses) {
        this.houses = houses;
    }

}
包映射;
导入java.util.List;
导入javax.persistence.*;
导入org.hibernate.annotations.Fetch;
导入org.hibernate.annotations.FetchMode;
@实体
@表(name=“Type”)
公共类类型{
私有int类型_id;
私有字符串名称;
私人名单账户;
私人上市公司;
公共类型(字符串名称)
{
this.name=名称;
}
公共类型()
{
}
@身份证
@生成值
@列(name=“id”)
public int getType_id(){
返回类型\u id;
}
公共void setType_id(int type_id){
this.type\u id=type\u id;
}
@列(name=“name”)
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@Fetch(FetchMode.JOIN)
@OneToMany(mappedBy=“type”)
公共帐户列表(){
归还账户;
}
公共帐户(列出帐户){
这个账户=账户;
}
@Fetch(FetchMode.JOIN)
@OneToMany(mappedBy=“type”)
公众名单{
归还房屋;
}
公共房屋(列表房屋){
这个房子=房子;
}
}
和房子

package mapping;

import java.util.*;
import javax.persistence.*;

@Entity
@Table(name="House")
public class House {
    private int id;
    private String name;
    private int sq_metrage;
    private String address;
    private float price;
    private String description;
    private Account owner;
    private State state;
    private Type type;
    private List<Reservation> reservations;
    private List<Opinion> opinions;

    public House(){

    }

    public House(String name, int sq_metrage, String address, float price, String description)
    {
        this.name = name;
        this.sq_metrage = sq_metrage;
        this.address = address;
        this.price = price;
        this.description = description;
    }

    @Id
    @GeneratedValue
    @Column(name="id")
    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;
    }
    @Column(name="sq_metrage")
    public int getSq_metrage() {
        return sq_metrage;
    }
    public void setSq_metrage(int sq_metrage) {
        this.sq_metrage = sq_metrage;
    }
    @Column(name="address")
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Column(name="price")
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    @Column(name="description")
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @ManyToOne (fetch=FetchType.EAGER)
    @JoinColumn(name="owner_id")
    public Account getOwner() {
        return owner;
    }
    public void setOwner(Account owner) {
        this.owner = owner;
    }

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="state_id")
    public State getState() {
        return state;
    }
    public void setState(State state) {
        this.state = state;
    }

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="type_id")
    public Type getType() {
        return type;
    }
    public void setType(Type type) {
        this.type = type;
    }

    @OneToMany(mappedBy="house")
    public List<Reservation> getReservations() {
        return reservations;
    }

    public void setReservations(List<Reservation> reservations) {
        this.reservations = reservations;
    }

    @OneToMany(mappedBy="house")
    public List<Opinion> getOpinions() {
        return opinions;
    }

    public void setOpinions(List<Opinion> opinions) {
        this.opinions = opinions;
    }

}
包映射;
导入java.util.*;
导入javax.persistence.*;
@实体
@表(name=“House”)
公屋{
私有int-id;
私有字符串名称;
私人国际平方米;
私有字符串地址;
私人浮动价格;
私有字符串描述;
私人帐户所有者;
私营国家;
私有类型;
私人名单预订;
私人名单意见;
酒店(){
}
酒店(字符串名称、整数平方米、字符串地址、浮动价格、字符串描述)
{
this.name=名称;
这个.sq_米=sq_米;
this.address=地址;
这个价格=价格;
this.description=描述;
}
@身份证
@生成值
@列(name=“id”)
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
@列(name=“name”)
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@列(名称=“平方米”)
公共int getSq_metrage(){
返回平方米;
}
公共空间设置平方米(整数平方米){
这个.sq_米=sq_米;
}
@列(name=“address”)
公共字符串getAddress(){
回信地址;
}
公共无效设置地址(字符串地址){
this.address=地址;
}
@列(name=“price”)
公开发行价格(){
退货价格;
}
公共定价(浮动价格){
这个价格=价格;
}
@列(name=“description”)
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“owner\u id”)
公共帐户getOwner(){
归还所有人;
}
公共无效集合所有者(帐户所有者){
this.owner=所有者;
}
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“state\u id”)
公共状态getState(){
返回状态;
}
公共无效设置状态(状态){
this.state=状态;
}
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“type\u id”)
公共类型getType(){
返回类型;
}
公共void集合类型(类型){
this.type=type;
}
@OneToMany(mappedBy=“house”)
公共列表{
返回预订;
}
公共预订(列出预订){
这个。保留=保留;
}
@OneToMany(mappedBy=“house”)
公众意见{
反馈意见;
}
公众意见(列出意见){
这个观点=观点;
}
}

任何帮助都将不胜感激:)

这是一个不清楚的问题,但我有两个猜测

  • findByHouseId函数正在关闭会话
  • 在获取数据时,您没有初始化连接的实体

  • 我猜您的房屋实体包含类型实体,因此您可以在您的类型类上添加
    @Fetch(FetchMode.JOIN)
    。(在某些情况下,它会复制值,因此您必须区分您的结果)

    您可以向我们展示您的完整实体类吗?