好吧,也许是一个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}它会返回代理,因为我从一开始就期待它。