Hibernate + Spring Data - 代理还是真实对象?

时间:2017-04-11 18:16:51

标签: java spring hibernate

好吧,也许是一个noob问题,但我对Hibernate何时返回真实对象及其代理时的情况感到困惑,例如 - 我使用JpaRepository并且其save()方法似乎返回了对象本身,意思是所有惰性集合都为null。
那么,有一个规则来确定存储库的方法是否会返回实体或代理,以及b)我是否应该总是在代码中检查集合为空?

UPD:做了一些调试,在当前事务中甚至repository.getOne(id)返回对象本身,同时当我输入早先存储在DB中的对象的id时,我得到代理,正如我所料。现在我更加困惑了:)左saveAndFlush()什么都没改变

UPD2:代码示例,希望有所帮助

@Entity
public class MyEntity {

@Id
@GeneratedValue
private Integer id;

@Column(nullable = false, unique = true, insertable=false)
private String dbGeneratedField;

@OneToMany(mappedBy = "myEntity", fetch = FetchType.LAZY)
private List<OtherEntity> otherEntities;

//getters, setters and stuff

}

// service method
@Transactional
public createMyEntity() {  
MyEntity entity = new MyEntity();
// set some necessary fields but not id

MyEntity e1 = myEntityRepository.save(entity);
return e1;
}

// repository
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {}

所以,我期望e1应该是代理或完全初始化的对象(意味着集合不是null),而不是它我得到对entity对象的引用。在调用save之后(假设它收到id = 111)我调用repository.findOne(111)我再次得到相同的引用,当我下次进入此方法(其他事务,保存另一个实体)并执行{{1}它会返回代理,因为我从一开始就期待它。

0 个答案:

没有答案