小编Nik*_*iko的帖子

Hibernate/Spring:懒得初始化 - 没有关闭会话或会话

对于答案,请向下滚动到此结尾...

基本问题与多次询问相同.我有一个简单的程序,有两个POJO事件和用户 - 用户可以有多个事件.

@Entity
@Table
public class Event {
 private Long id;
 private String name;
 private User user;

 @Column
 @Id
 @GeneratedValue
 public Long getId() {return id;}
 public void setId(Long id) { this.id = id; }

 @Column
 public String getName() {return name;}
 public void setName(String name) {this.name = name;}

 @ManyToOne
 @JoinColumn(name="user_id")
 public User getUser() {return user;}
 public void setUser(User user) {this.user = user;}

}
Run Code Online (Sandbox Code Playgroud)

用户:

@Entity
@Table
public class User {
 private Long id;
 private String name;
 private List<Event> events; …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate lazy-loading

38
推荐指数
3
解决办法
10万
查看次数

在Neo4j/Spring-Data中加载/获取Lazy/Eager

我有一个简单的设置,遇到一个令人费解的(至少对我来说)问题:

我有三个相互关联的pojos:

@NodeEntity
public class Unit {
    @GraphId Long nodeId;
    @Indexed int type;
    String description;
}


@NodeEntity
public class User {
    @GraphId Long nodeId;
    @RelatedTo(type="user", direction = Direction.INCOMING)
    @Fetch private Iterable<Worker> worker;
    @Fetch Unit currentUnit;

    String name;

}

@NodeEntity
public class Worker {
    @GraphId Long nodeId;
    @Fetch User user;
    @Fetch Unit unit;
    String description;
}
Run Code Online (Sandbox Code Playgroud)

所以你有User-Worker-Unit有一个"currentunit",它在用户中标记允许直接跳转到"当前单位".每个用户可以有多个工作人员,但只有一个工作人员被分配到一个单元(一个单元可以有多个工作人员).

我想知道的是如何控制"User.worker"上的@Fetch注释.我实际上希望这只在需要的时候加盖,因为大多数时候我只和"工人"一起工作.

我浏览了http://static.springsource.org/spring-data/data-neo4j/docs/2.0.0.RELEASE/reference/html/,对我来说并不是很清楚:

  • worker是可迭代的,因为它应该是只读的(传入关系) - 在文档中这是明确说明的,但是在示例中''Set''在大多数情况下被使用.为什么?或者不重要......
  • 如何让工作人员只加载访问权限?(懒加载)
  • 为什么我需要用@Fetch注释简单的关系(worker.unit).有没有更好的方法?我有另外一个与MANY这样简单关系的实体 - 我真的想避免因为我想要一个对象的属性而加载整个图形.
  • 我错过了一个弹簧配置,所以它适用于延迟加载?
  • 有没有办法通过额外的呼叫加载任何关系(没有标记为@Fetch)?

从我的看法来看,这个构造只要我想要一个Worker就加载整个数据库,即使我大部分时间都不关心用户.

我发现的唯一解决方法是使用存储库并在需要时手动加载实体.

-------更新-------

我已经使用neo4j很长一段时间了,并找到了上述问题的解决方案,不需要一直调用fetch(因此不会加载整个图形).唯一的缺点:它是运行时方面:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import …
Run Code Online (Sandbox Code Playgroud)

neo4j spring-data-graph spring-data-neo4j

15
推荐指数
1
解决办法
6305
查看次数