子对象不会与 Spring 数据中的父对象一起获取



我对Hibernate很陌生,我已经在父对象和子对象之间建立了@OneToMany双向关系,并期望当我将所有内容保留在数据库中时,将父对象设置为子对象(因为子对象是关系的所有者(,当我使用ORM获取父对象时,我也希望获取一个子对象,但作为回报,我看到零子对象。

据我从互联网上已经读到的内容中了解到,当我将子对象作为与父关系的所有者时,ORM 应该根据预定义的关系映射来连接两个对象的魔术。此信息正确吗?

@Entity
@Table(name = "stream")
@SequenceGenerator(name = "sequence", sequenceName = "stream_id", allocationSize = 1)
public class StreamEntity extends EntityWithId {
// @MappedSuperclass with ID 
@Column(name = "request_id")
@OneToMany(
mappedBy = "streamEntity",
fetch = FetchType.LAZY
)
private List<RequestEntity> requestEntities = new ArrayList<>();
// getters setters
}
@Entity
@Table(name = "request")
@SequenceGenerator(name = "sequence", sequenceName = "request_id", allocationSize = 1, initialValue = 1)
public class RequestEntity extends EntityWithId {
// @MappedSuperclass with ID 
@JoinColumn(name = "stream_id")
@ManyToOne(fetch = FetchType.LAZY)
private StreamEntity streamEntity;
// getters setters
}

一些测试:

@Test
public void createStreamWithSeveralStreamTargetsAndDeleteStream() {
List<StreamEntity> streamEntities = createStream(1); // stream object is persisted here
List<RequestEntity> requestEntitySave = createRequest(1, streamEntityCheck);
assertEquals(1, requestEntitySave.size()); // request entity is persisted with the stream object into the database
List<StreamEntity> streamEntities = streamDao.findAll();
assertEquals(1, streamEntities.size());
StreamEntity streamEntity2 = streamEntities.get(0);
streamEntity2.getRequestEntities(); - this collection shows 0
}

我错过了什么?

更新: 正如 @Alan Hay 建议的那样,我已经在我的测试中添加了一个@Persistent上下文,现在它看起来像这样:

@PersistenceContext
private EntityManager em;

@Test
public void createStreamWithSeveralStreamTargetsAndDeleteStream() {
List<StreamEntity> streamEntities = createStream(1); // stream object is persisted here
List<RequestEntity> requestEntitySave = createRequest(1, streamEntityCheck);
assertEquals(1, requestEntitySave.size()); // request entity is persisted with the stream object into the database
em.clear();
List<RequestEntity> requestEntities = requestDao.findAll();
assertEquals(1, requestEntities.size()); // retirns zero objects
List<StreamEntity> streamEntities = streamDao.findAll();
assertEquals(1, streamEntities.size());
StreamEntity streamEntity2 = streamEntities.get(0);
streamEntity2.getRequestEntities();// this collection shows 0
}

在我这样做之后,我在requestDao.findAll((上得到了零个对象; step。我在上一步中提交了这些更改,为什么我无法获取此实体?

由于一级缓存的概念,您创建和保存的初始对象和您加载的对象是同一个实例。由于您没有将创建的请求实体添加到内存中模型,而只是将其保存到数据库中,因此内存中模型中不存在关系。

要获得所需的结果,您需要清除保存和重新加载之间的持久性上下文。

@Test
public void createStreamWithSeveralStreamTargetsAndDeleteStream() {
List<StreamEntity> streamEntities = createStream(1); 
List<RequestEntity> requestEntitySave = createRequest(1, streamEntityCheck);
assertEquals(1, requestEntitySave.size()); 
//you need to clear the persistence context here
//now a db query should execute.
//Inject the entitymanager to your test @PersistenceContext EntityManager em;
em.clear();
List<StreamEntity> streamEntities = streamDao.findAll();
assertEquals(1, streamEntities.size());
StreamEntity streamEntity2 = streamEntities.get(0);
streamEntity2.getRequestEntities(); - this collection shows 0
}

最新更新