Java JPA FetchType.EAGER不起作用 [英] Java JPA FetchType.EAGER does not work

查看:406
本文介绍了Java JPA FetchType.EAGER不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用JPA在Java EE(Jersey)中创建一个应用程序,其中的未初始化实体存在问题.我有3个实体,汽车,所有者,房屋,其中汽车可以有多个所有者,所有者可以有多个房屋.当我返回(entityManager.find)汽车时,所有者将被初始化.当我返回房屋时,将初始化所有者,但不会初始化汽车.我希望能够调用诸如House.getOwner().getCar().getId()之类的东西.现在,我必须在House上致电find,然后在Owner上致电find以获得Car.我该如何解决?

I'm making an application in Java EE (Jersey) with JPA where I have a problem with the uninitialized entities. I have 3 entities Car, Owner, House where the car can have multiple owners and owners can have multiple houses. When i return (entityManager.find) Car then owner is initialized. When i return House then Owner is initialized, but Car is not. I would like to be able to call something like House.getOwner().getCar().getId(). Now I must call find on House and then call find on Owner to get Car. How do I resolve this?

@Entity
@Table(name = "House")
public class HouseEntity {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "owner_id", nullable = false)
  private OwnerEntity owner;
}

@Entity
@Table(name = "Owner")
public class OwnerEntity {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "car_id")
  private CarEntity car;

  @OneToMany(mappedBy = "owner")
  @JoinColumn(name = "house", nullable = false)
  private Set<HouseEntity> house;

}

@Entity
@Table(name = "Car")
public class CarEntity {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @OneToMany(mappedBy = "owner")
  private Set<OwnerEntity> owner;
}

Edit1:对不起,映射中有错误,类运行良好.但是初始化问题仍然存在.

Sorry there was mistake in mapping, classes working well. But problem with initialization remains.

推荐答案

尝试一下:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "House")
public class HouseEntity {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne
    @JoinColumn(name = "owner_id", nullable = false)
    private OwnerEntity owner;

    public long getId() {
        return id;
    }

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

    public OwnerEntity getOwner() {
        return owner;
    }

    public void setOwner(OwnerEntity owner) {
        this.owner = owner;
    }

}





import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Owner")
public class OwnerEntity {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne
    @JoinColumn(name = "car_id")
    private CarEntity car;

    @OneToMany(mappedBy = "owner", fetch = FetchType.EAGER)
    private Set<HouseEntity> houses;

    public long getId() {
        return id;
    }

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

    public CarEntity getCar() {
        return car;
    }

    public void setCar(CarEntity car) {
        this.car = car;
    }

    public Set<HouseEntity> getHouses() {
        return houses;
    }

    public void setHouses(Set<HouseEntity> houses) {
        this.houses = houses;
    }

}



import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Car")
public class CarEntity {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany(mappedBy = "car", fetch = FetchType.EAGER)
    private Set<OwnerEntity> owner;

    public long getId() {
        return id;
    }

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

    public Set<OwnerEntity> getOwner() {
        return owner;
    }

    public void setOwner(Set<OwnerEntity> owner) {
        this.owner = owner;
    }

    public void addOwner(OwnerEntity owner){
        this.owner.add(owner);
    }

}

当您提取Car时,将填充整个对象图.

When you fetch for Car entire object graph will be populated.

这篇关于Java JPA FetchType.EAGER不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆