2017-10-04 131 views
0

我是使用spring boot + jersey api + JPA的新人。 我有三个使用一对多双向映射的实体。当我使用spring boot + jersey api + JPA时我收到错误: failed to lazily initialize a collection of role: com.kavinaam.GSTbilling.entity.Country.states, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.kavinaam.GSTbilling.entity.City["states"]->com.kavinaam.GSTbilling.entity.States["countyId"]->com.kavinaam.GSTbilling.entity.Country["states"])Spring boot + jersey api + JPA:未能懒洋洋地初始化角色集合

我已经添加了我的实体,道,服务和终点。

@Entity 
@Table(name="country") 
public class Country implements Serializable { 
    private static final long serialVersionUID = 1L; 

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

    @OneToMany(mappedBy = "countyId",cascade = CascadeType.ALL) 
    private Set<States> states; 

    public int getId() { 
     return id; 
    } 

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

    public String getCountryName() { 
     return countryName; 
    } 

    public void setCountryName(String countryName) { 
     this.countryName = countryName; 
    } 

    public Set<States> getStates() { 
     return states; 
    } 

    public void setStates(Set<States> states) { 
     this.states = states; 
    } 

} 

我的状态类:

@Entity 
@Table(name="states") 
public class States implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

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

@ManyToOne 
@JoinColumn(name="countyId") 
private Country countyId; 

@Column(name="stateName") 
private String stateName; 

@OneToMany(mappedBy = "states", cascade = CascadeType.ALL) 
private Set<City> city; 

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


public Country getCountyId() { 
    return countyId; 
} 
public void setCountyId(Country countyId) { 
    this.countyId = countyId; 
} 
public String getStateName() { 
    return stateName; 
} 
public void setStateName(String stateName) { 
    this.stateName = stateName; 
} 
public Set<City> getCity() { 
    return city; 
} 
public void setCity(Set<City> city) { 
    this.city = city; 
} 
} 

我的城市类:

@Entity 
@Table(name="cities") 
public class City implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

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

@ManyToOne 
@JoinColumn(name="stateId") 
private States states; 

@Column(name="cityName") 
private String cityName; 

@Column(name="zip") 
private String zip; 


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


public States getStates() { 
    return states; 
} 
public void setStates(States states) { 
    this.states = states; 
} 
public String getCityName() { 
    return cityName; 
} 
public void setCityName(String cityName) { 
    this.cityName = cityName; 
} 
public String getZip() { 
    return zip; 
} 
public int getId() { 
    return id; 
} 

} 

吾道:

@Transactional 
@Repository 
public class GSTCityDAO implements IGSTCityDAO { 

@PersistenceContext 
private EntityManager entityManager; 

//@SuppressWarnings("unchecked") 
@Override 
public List<City> getAllCities() { 
    //Session session = sessionFactory.getCurrentSession(); 
    String hql = "FROM City as ct ORDER BY ct.id"; 
    List<City> l = entityManager.createQuery(hql,City.class).getResultList(); 

    return l; 
    } 

@Override 
public City getCityById(int cityId) { 
    return entityManager.find(City.class, cityId); 
} 

@SuppressWarnings("unchecked") 
@Override 
public List<City> getCityByStateId(States stateId) { 
    String getcitybystate = " FROM City as c WHERE c.states = ?"; 
    return (List<City>) entityManager.createQuery(getcitybystate).setParameter(1, stateId).getResultList(); 
} 

@Override 
public void addCity(City city) { 
    entityManager.persist(city); 

} 

@Override 
public void updateCity(City city) { 
    City cityctl = getCityById(city.getId()); 
    cityctl.setCityName(city.getCityName()); 
    cityctl.setZip(city.getZip()); 
    cityctl.setStates(city.getStates()); 
    entityManager.flush(); 
} 

@Override 
public void deleteCity(int cityId) { 
    entityManager.remove(getCityById(cityId)); 
} 

@Override 
public boolean cityExists(String name, String zip) { 
    String hql = "FROM City WHERE cityName = ? and zip = ?"; 
    int count = entityManager.createQuery(hql).setParameter(1,name).setParameter(2, zip).getResultList().size(); 
    return count > 0 ? true : false; 
} 

} 

服务:

@Service 
public class GSTCityService implements IGSTCityService { 

@Autowired 
private IGSTCityDAO cityDAO; 

@Override 
public List<City> getAllCities() { 
    List<City> l = cityDAO.getAllCities(); 
    Hibernate.initialize(l); 
    return l; 
} 

public List<City> getCityByStateId(States stateId) { 
     return cityDAO.getCityByStateId(stateId); 
} 

@Override 
public City getCityById(int cityId) { 
    City city = cityDAO.getCityById(cityId); 
    return city; 
} 

@Override 
public synchronized boolean addCity(City city) { 
    if(cityDAO.cityExists(city.getCityName(), city.getZip())){ 
     return false; 
    }else{ 
     cityDAO.addCity(city); 
    return true; 
    } 
} 

@Override 
public void updateCity(City city) { 
    cityDAO.updateCity(city); 
} 

@Override 
public void deleteCity(int cityId) { 
    cityDAO.deleteCity(cityId); 

} 

} 

终点:

@Component 
@Path("/") 
public class Test { 
private static final Logger logger = LoggerFactory.getLogger(Test.class); 
@Autowired 
private IGSTCityService cityService; 

@GET 
@Path("/hi") 
@Produces(MediaType.APPLICATION_JSON) 
public Response hello(){ 
    return Response.ok("Hello GST").build(); 
} 

@GET 
@Path("/test") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getAllDate(){ 
    List<City> list = cityService.getAllCities(); 
    for(City city: list){ 
     System.out.println(city); 
    } 
    return Response.ok(list).build(); 
} 

@GET 
@Path("/test/{id}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getAllDateBySome(@PathParam("id") Integer id){ 
    States state = new States(); 
    state.setId(id); 
    List<City> list = cityService.getCityByStateId(state); 
    return Response.ok(list).build(); 
} 

@GET 
@Path("/{id}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getDataById(@PathParam("id")Integer id){ 
    City citl = cityService.getCityById(id); 
    return Response.ok(citl).build(); 
} 

@POST 
@Path("/add") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addData(City city){ 
    boolean isAdded = cityService.addCity(city); 
    if(!isAdded){ 
     return Response.status(Status.CONFLICT).build(); 
    } 
    return Response.created(URI.create("/gst/"+ city.getId())).build(); 
} 

@PUT 
@Path("/update") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Response updateCountry(City city){ 
     cityService.updateCity(city); 
     return Response.ok(city).build(); 
} 

@DELETE 
@Path("/{id}") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response deleteCountry(@PathParam("id")Integer id){ 
    cityService.deleteCity(id); 
    return Response.noContent().build(); 
} 

} 

我使用进口org.springframework.transaction.annotation.Transactional;在DAO中是跨国的。我也不能使用@PersistenceContext(类型= PersistenceContextType.EXTENDED)和提取类型渴望,因为我得到最大堆栈大小的误差超过

+0

在调用哪些方法时发生错误? –

+0

public response getAllDate(){ \t \t List list = cityService.getAllCities(); \t \t(城市:列表){ \t \t \t System.out.println(city); \t \t} \t \t return Response.ok(list).build(); \t \t} 当它返回Response.ok(list).build()时发生错误。 我认为当它要求在浏览器中打印数据时,会话可能会被关闭。 –

回答

0

你应该做以下的一种或两种:

1 )将从DAO移动到服务。通常情况下,这是一个好主意,它仍然以某种方式在该层上处理结果实体。

2)获取的依赖关系明确查询:

select ct FROM City as ct inner join fetch ct.states s ORDER BY ct.id 
+0

未能延迟初始化角色集合:com.kavinaam.GSTbilling.entity.Country。状态,不能初始化代理 - 没有会话(通过引用链:java.util.ArrayList [0] - > com.kavinaam.GSTbilling.entity.City [“states”] - > com.kavinaam.GSTbilling.entity.States [ “countyId”] - > com.kavinaam.GSTbilling.entity.Country [“states”]) 仍然是同样的错误 –

+0

所以加内连接取s.country c –

+0

相同。没有改变的错误。 –

0

我通过使用一对多关系@JsonBackReference解决它。问题在于序列化和反序列化。 “用@JsonManagedReference注解注解的属性通常被处理(正常序列化,没有反序列化的特殊处理),并且用@JsonBackReference注解注释的属性没有被序列化;在反序列化过程中,它的值被设置为具有”managed“ (向前)链接“。

相关问题