Mysql org.hibernate.LazyInitializationException-无法初始化代理-无会话
访问我声明的servlet时出现以下错误: 直接从Servlet获取服务时:Mysql org.hibernate.LazyInitializationException-无法初始化代理-无会话,mysql,database,hibernate,spring-mvc,transactions,Mysql,Database,Hibernate,Spring Mvc,Transactions,访问我声明的servlet时出现以下错误: 直接从Servlet获取服务时: public class UpdateFloorEventServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ApplicationContext
public class UpdateFloorEventServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
try {
FloorService floorService = (FloorService)context.getBean("floorService");
Floor floor = (Floor) floorService.findById (floorId);
...
}
@Transactional(propagation = Propagation.SUPPORTS)
@Service("floorService")
public class FloorServiceImpl implements FloorService {
...
}
谢谢
我发现问题与控制器无关,当我设置属性时,问题与控制器有关:
floor.setNumberOfEvents ((Long)numOfEvents);
@Entity
@Table(name="T_FLOOR")
public class Floor {
@Id
@Column(name = "FLOOR_ID", unique = true, nullable = false)
private Integer id;
@Column(name = "FLOOR_KEY")
private String floorKey;
@Column(name = "NUMBER_OF_EVENTS")
private Long numberOfEvents;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Long getNumberOfEvents() {
return numberOfEvents;
}
public void setNumberOfEvents(Long numberOfEvents) {
this.numberOfEvents = numberOfEvents;
}
public String getFloorKey() {
return floorKey;
}
public void setFloorKey(String floorKey) {
this.floorKey = floorKey;
}
}
MySQL
UpdateFloorEventServlet
的第59行是什么?更重要的是,为什么要将控制器和服务层混搭在一起?它们应该完全分开。您不需要扩展HttpServlet,应该创建一个控制器类并使用MVC注释@controller。你用这个类打破了Spring的IoC的全部要点。但是,如果你决心这么做,你是否正确地设置了事务管理器?Hibernate的意思是,它没有事务会话,因此无法设置您试图设置的集合。如果我们可以看到您试图在服务中修改的对象,这会有所帮助。您需要发布您正在使用的Spring配置。我发现问题与控制器无关,它是在我设置对象楼层时出现的。setNumberOfEvents((长)numOfEvents);
floor.setNumberOfEvents ((Long)numOfEvents);
@Entity
@Table(name="T_FLOOR")
public class Floor {
@Id
@Column(name = "FLOOR_ID", unique = true, nullable = false)
private Integer id;
@Column(name = "FLOOR_KEY")
private String floorKey;
@Column(name = "NUMBER_OF_EVENTS")
private Long numberOfEvents;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Long getNumberOfEvents() {
return numberOfEvents;
}
public void setNumberOfEvents(Long numberOfEvents) {
this.numberOfEvents = numberOfEvents;
}
public String getFloorKey() {
return floorKey;
}
public void setFloorKey(String floorKey) {
this.floorKey = floorKey;
}
}
CREATE TABLE `T_FLOOR` (
`FLOOR_ID` int(11) NOT NULL AUTO_INCREMENT,
`FLOOR_KEY` varchar(45) DEFAULT NULL,
`FLOOR_DESC` varchar(45) DEFAULT NULL,
`LOCATION_ID` int(11) DEFAULT NULL,
`NUMBER_OF_EVENTS` bigint(20) DEFAULT NULL,
`LAST_EVENT` timestamp NULL DEFAULT NULL,
`LAST_UPDATE` timestamp NULL DEFAULT NULL,
`LATITUDE` float DEFAULT NULL,
`LONGITUDE` float DEFAULT NULL,
PRIMARY KEY (`FLOOR_ID`),
UNIQUE KEY `FLOOR_ID_UNIQUE` (`FLOOR_ID`),
KEY `FK_floor_location` (`LOCATION_ID`),
CONSTRAINT `FK_door_location` FOREIGN KEY (`LOCATION_ID`) REFERENCES `T_LOCATION` (`LOCATION_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8