我有一个模型,它有一个相当大的子实体图,hibernate最终生成了大约9条语句来懒洋洋地获取所需的所有数据,但大约有4层深,我得到了一个“无法初始化代理-没有会话”错误,我不知道为什么。
控制器
@Transactional(readOnly = true)
@RequestMapping(value = "/v2/plans", method = RequestMethod.GET)
public @ResponseBody List<PlanPresenter> show(HttpServletRequest request) throws Exception {
List<PlanPresenter> planPresenters = new ArrayList<>();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Plan> planQuery = criteriaBuilder.createQuery(Plan.class);
Root<Plan> root = planQuery.from(Plan.class);
if (request.getParameter("region") != null || request.getParameter("group") != null) {
List<Predicate> criteria = new ArrayList<Predicate>();
if (request.getParameter("region") != null) {
criteria.add(criteriaBuilder.equal(root.get(Plan_.region), request.getParameter("region")));
}
if (request.getParameter("group") != null) {
criteria.add(criteriaBuilder.equal(root.get(Plan_.groupCode), request.getParameter("group")));
criteria.add(root.get(Plan_.planSetId).in(groupPlanSetIds));
} else {
criteria.add(root.get(Plan_.planSetId).in(currentPlanSetIds));
}
Query query = entityManager.createQuery(planQuery.where(criteriaBuilder.and(criteria.toArray(new Predicate[]{}))));
for (Plan plan : (List<Plan>)query.getResultList()) {
planPresenters.add(new PlanPresenter(plan));
}
}
return planPresenters;
}
节目主持人
public class PlanPresenter {
public String id;
public String plan_set_id;
public String region;
public String name;
public String description;
public HashMap<String, Object> details = new HashMap<String, Object>();
public PlanPresenter(Plan plan) throws Exception {
this.id = String.valueOf(plan.id);
this.plan_set_id = String.valueOf(plan.planSetId);
this.region = plan.region.trim();
this.name = plan.getName();
this.description = plan.getDescription();
this.details.put("spanish_plan", plan.isSpanishPlan());
this.details.put("mutually_exclusive", plan.isMutuallyExclusive());
this.details.put("group_plan", plan.isGroupPlan());
this.details.put("group_code", plan.groupCode.trim());
this.details.put("family_plan", plan.isFamilyPlan());
this.details.put("price", plan.getPrice());
this.details.put("enrollment_fee", plan.getEnrollmentFee());
this.details.put("riders", plan.getRiders());
}
}
计划
@Entity
public class Plan implements Serializable {
private static final long serialVersionUID = 7639611964474770505L;
private static List<String> familyPlanShortNames = Arrays.asList("ABCD");
@Transient
private String description = "";
(Column definitions)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "XXXX", insertable = false, updatable = false, nullable = true)
@NotFound(action = NotFoundAction.IGNORE)
public PlanDetail planDetail;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "XXXX", insertable = false, updatable = false, nullable = true)
@OrderBy("XXXX")
@NotFound(action = NotFoundAction.IGNORE)
public List<Rider> riders;
public String getName() {
return this.planDetail != null ? this.planDetail.longName.trim() : null;
}
public Boolean isSpanishPlan() {
return this.language.trim().equals("ES");
}
public Boolean isMutuallyExclusive() {
return this.mutuallyExclusive.trim().equals("Y");
}
public Boolean isGroupPlan() {
return this.groupCode != null && !this.groupCode.trim().equals("");
}
public Boolean isFamilyPlan() {
return familyPlanShortNames.contains(this.planDetail.shortName.trim());
}
public BigDecimal getPrice() {
return this.planDetail != null ? this.planDetail.price.setScale(2) : null;
}
public BigDecimal getEnrollmentFee() {
return this.planDetail != null ? this.planDetail.enrollmentFee.setScale(2) : null;
}
public String getDescription() {
if (this.planDetail != null && this.planDetail.brochureSections != null) {
this.planDetail.brochureSections.forEach((brochureSection) -> {
if (brochureSection.type.trim().equals("P1") && brochureSection.order == 1) {
this.description = this.description + " " + brochureSection.text.trim();
}
});
}
return this.description.trim();
}
public List<HashMap<String, Object>> getRiders() {
List<HashMap<String, Object>> riders = new ArrayList<HashMap<String, Object>>();
if (this.riders != null && this.riders.size() > 0) {
this.riders.forEach((rider) -> {
HashMap<String, Object> planRider = new HashMap<String, Object>();
planRider.put("name", rider.getName());
planRider.put("price", rider.getPrice());
planRider.put("description", rider.getDescription());
riders.add(planRider);
});
}
return riders;
}
}
计划详情
@Entity
public class PlanDetail implements Serializable {
private static final long serialVersionUID = 2256881691562712018L;
(Column definitions)
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "XXXX", referencedColumnName = "XXXX", insertable = false, updatable = false, nullable = true)
@OrderBy("XXXX")
@NotFound(action = NotFoundAction.IGNORE)
public List<BrochureSection> brochureSections;
}
小册子部分
@Entity
public class BrochureSection implements Serializable {
private static final long serialVersionUID = 1856191232387921427L;
(Column definitions)
}
例外
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.models.PlanDetail.brochureSections, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:576) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:215) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:555) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:143) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:294) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at java.lang.Iterable.forEach(Iterable.java:74) ~[?:1.8.0_66]
at com.models.Plan.getDescription(Plan.java:100) ~[classes/:?]
at com.presenters.v2.PlanPresenter.<init>(PlanPresenter.java:20) ~[classes/:?]
at com.controllers.v2.PlansController.show(PlansController.java:64) ~[classes/:?]
任何帮助都将不胜感激。
我也有同样的例外,问题是,我有一个实体没有映射
@Entity
Class A {
}
@Entity
Class B {
private A a;
}
解决方案
@Entity
Class B {
@OneToOne
@MapsId
private A a;
}
可以保留延迟加载,而无需设置enable\u lazy\u load\u no\u trans参数。我找到的最简单的解决方案是在使用Spring数据JPA时使用@NamedEntityGraph。https://www.baeldung.com/spring-data-jpa-named-entity-graphs
缺点是@NamedEntityGraph中不能有多个集合。添加第二个集合导致异常组织。冬眠装载机。MultipleBagFetchException:无法同时提取多个行李:
因此,如果您不想使用反模式,并且只有一个要尝试加载的集合,@NamedEntityGraph和@EntityGrpah适用于Spring Data JPA。
如果你想保持延迟加载,并且你正在使用Spring Boot,只需在application.properties中添加以下配置:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
问题内容: 我有一个模型,该模型具有相当大的子实体图,并且hibernate最终制作了大约9条语句来懒惰地获取所有所需的数据,但是深度约4层时,出现“无法初始化代理- 没有会话”错误,我不知道为什么。 控制者 主持人 计划 计划明细 手册部分 例外 任何帮助,将不胜感激。 问题答案: 如果您希望保持 延迟加载 并且正在使用Spring Boot,只需在 application.properties
我有一个LazyInitializationException问题,我不知道如何解决它。 之前的问题是我打电话的时候。getperson=null,但我修复了findProjectEmployeesWithinDates请求获取此人的调用。但当我调用“findProjectEmployeesWithinDates”时,我遇到了一个例外。查找项目员工的代码包括: 所以用debbug我看到: 它位于f
我正在构建一个使用并返回JSON的RESTful Web服务。当我试图通过服务层从数据库中获取ESBRATING对象时,遇到以下堆栈跟踪。然而,当我将Spring数据JPA存储库直接注入控制器并使用它来获取ESRBRating by ID时,它工作得很好。但是,当通过服务层调用时,它不起作用。我在下面提供了堆栈跟踪和代码。有人能向我解释一下为什么在通过服务层时会发生这种情况,而在直接通过Sprin
我使用< code>spring-data-jpa与< code > spring-boot(v 2 . 0 . 0 . release),我刚刚在MySQL上写了一个CRUD演示,但是在运行时出现异常,源代码如下: 源码 User.java UserRepository.java 用户服务测试.java 应用程序.yml 例外详细信息 我尝试另一种方法,它可以成功运行。
我正在使用JPA(Hibernate 4 . 3 . 3作为持久性提供者)和Spring (3.2.2),我所有的字段都加载得很好,但是当我试图访问我的集合时,它抛出了错误- 当我调试这个时,我的实体类中定义的每个集合都有错误- 我尝试使用collection.size()和Hibernate.initialize(),但都不起作用。在Internet上搜索时,我发现扩展Persitence将解决
我正在用Spring roo管理一个项目,并且我正在使用hibernate,当我试图使用这个控制器方法时,我得到了这个异常消息:无法初始化代理-没有会话 以下是控制器方法: 以及导致异常的服务方法 为什么会出现这种异常?即使我用@Transactionnal注释我的服务方法,我也会查看applicationContext。xml文件,并找到此行 是 mode=“aspectj” 部分取消了该注释的