我正在收集有关flush()方法的信息,但我不清楚何时使用它以及如何正确使用它.根据我的阅读,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据.
现在,我得到下列设想两个实体A和B(在一比一的关系,而不是由JPA执行或模拟).A有一个复合PK,它是手动设置的,还有一个自动生成的IDENTITY字段recordId.这recordId应该B作为外键写入实体A.我正在保存A并B进行单笔交易.问题是自动生成的价值A.recordId是不可用的事务中,除非我做的一个显式调用em.flush()打完电话后em.persist()上A.(如果我有一个自动生成的IDENTITY PK,那么该值将在实体中直接更新,但这不是这里的情况.)
可以em.flush()在一个事务中使用时造成什么伤害?
我有一个EJB,我将对象保存到数据库.在我看到的一个例子中,一旦保存了这个数据(EntityManager.persist),就会调用EntityManager.flush(); 为什么我需要这样做?我保存的对象没有附加,以后不在方法中使用.事实上,一旦保存,方法返回,我希望资源被释放.(示例代码也会在删除调用中执行此操作.)
if (somecondition) {
entityManager.persist(unAttachedEntity);
} else {
attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
Run Code Online (Sandbox Code Playgroud) 我的问题是为什么冲洗不起作用:
public void ejbService(){
Customer c = em.find(Customer.class,1);
c.setName("newName");
em.flush();
//at this point when I query mysql table I can not see "newName"
thread.sleep(10000);
c.setName("anotherName");
}
Run Code Online (Sandbox Code Playgroud)
完成方法后,我在db中看到"anotherName",我也用em.find(Customer.class,1,Lock.None)检查它; 但仍然不行
RGDS
因为调用flush()来使每个实体从内存持久存储到数据库.因此,如果我使用调用太多不必要的flush(),则可能需要很长时间,因此不是性能的好选择.这是一个我不知道何时调用flush()的场景?
//Order and Item have Bidirectional Relationships
Order ord = New ord("my first order");
Item item = New Item("tv",10);
//...process item and ord object
em.persist(ord);//em is an instance of EntityManager
em.flush();// No.1 flush()
item.setOrder(ord);
em.persist(item);
Set<Item> items= new HashSet<Item>();
items.add(item);
ord.setItems(items);
em.flush();// No.2 flush()
Run Code Online (Sandbox Code Playgroud)
我的问题是:拨打第1号同花顺是否可以避免?
我担心的是:为了执行item.setOrder(ord),我们需要一个ord的数据库ID.并且只调用em.persist(ord)无法生成数据库ID,因此我必须在item.setOrder(ord)之前调用em.flush().那么你们的观点是什么?
提前致谢.
在JPA中,如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?或者我们应该叫他们俩?有什么不同?因为我有JPA的问题,当我将实体插入数据库时,我调用persist().在数据库中,数据已被插入(可以获取),但该数据不会显示在我的应用程序中(我使用findAll()获取它).它出现在另一个实体上.有什么我不知道的吗?我正在使用标准的Spring CRUD,JPA resource_local和postgresql.对不起我的英文,提前谢谢
只是一个简单的问题,但是这段代码中需要刷新吗?请注意,这将在JPA事务中.
User user = new User();
em.persist(user);
em.flush;
User aUser = em.find(User.class,user.getId());
assert(user.equals(aUser));
Run Code Online (Sandbox Code Playgroud)
或者没有冲洗它会工作吗?
User user = new User();
em.persist(user);
User aUser = em.find(User.class,user.getId());
assert(user.equals(aUser));
Run Code Online (Sandbox Code Playgroud)
或者相同的问题,但更多涉及的例子:
User user = em.find(User.class,id);
user.setName("My Name");
em.merge(user);
em.flush; //Is this line needed?
User aUser = em.createQuery("select u from User where u.name = 'My Name');
assert(user.equals(aUser));
Run Code Online (Sandbox Code Playgroud)