在NHibernate 3.0中,FlushMode.Auto仅在环境事务下运行时无效(即,无需启动NHibernate事务).应该是?
using (TransactionScope scope = new TransactionScope())
{
ISession session = sessionFactory.OpenSession();
MappedEntity entity = new MappedEntity() { Name = "Entity", Value = 20 };
session.Save(entity);
entity.Value = 30;
session.SaveOrUpdate(entity);
// This returns one entity, when it should return none
var list = session.
CreateQuery("from MappedEntity where Value = 20").
List<MappedEntity>();
}
Run Code Online (Sandbox Code Playgroud)
(从这个相关问题无耻地偷走的例子)
在NHibernate的来源,我可以看到这就是它检查是否有正在进行中(在一个事务SessionImpl.AutoFlushIfRequired),但相关方法(SessionImpl.TransactionInProgress)不考虑环境事务-不像它的近亲ConnectionManager.IsInActiveTransaction,这确实考虑环境事务.
nhibernate flush transactionscope distributed-transactions nhibernate-3
我正在使用Hibernate和EntityManager.我用的时候
Session session = (Session)entityManager.getDelegate();
session.flush();
session.clear();
Run Code Online (Sandbox Code Playgroud)
我明白了
java.lang.ClassCastException: org.hibernate.action.EntityIdentityInsertAction cannot be cast to org.hibernate.action.EntityInsertAction
at org.hibernate.engine.ActionQueue$InsertActionSorter.sort(ActionQueue.java:636)
at org.hibernate.engine.ActionQueue.sortInsertActions(ActionQueue.java:369)
at org.hibernate.engine.ActionQueue.sortActions(ActionQueue.java:355)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:224)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
Run Code Online (Sandbox Code Playgroud)
既然它没有说明哪个实体导致问题,我就被困在这里.有谁知道是什么原因引起的?
有人可以解释为什么在这个例子中"lastAccessed"日期没有保存到数据库中,以及如何将它保存到数据库中?我的理解是do对象是save()调用之后的附加对象,因此所有修改都应该自动保留.
注意:"myDate"正确保留,因此所有其他弹簧配置似乎都是正确的.
@Transactional(readOnly = false)
public DateObject getOrCreateDateObject(Date myDate) {
DateObject do = null;
do = getCurrentDateObject(); // For my tests, this has been returning null
if (do == null) {
// create a new object
do = new DateObject();
do.setDate(myDate);
sessionFactory.getCurrentSession().save(do);
}
// This does not persist to the database
do.setLastAccessed(new Date());
return do;
}
Run Code Online (Sandbox Code Playgroud)
在save()调用之后,我还尝试了以下一些组合(以及更多).这些都不起作用:
sessionFactory.getCurrentSession().merge(do); // tried before and after do.setDate(d2)
sessionFactory.getCurrentSession().update(do);
sessionFactory.getCurrentSession().saveOrUpdate(do);
sessionFactory.getCurrentSession().flush();
DateObject doCopy = (DateObject)sessionFactory.getCurrentSession().load(DateObject.class, do.getId());
sessionFactory.getCurrentSession().merge(doCopy);
doCopy.setLastAccessed(new Date());
Run Code Online (Sandbox Code Playgroud)
我希望这是一个简单的答案,我只是没有看到.谢谢您的帮助!
编辑#1 05/22/2012
根据要求,这是该实体的映射,在src/main/resources/META-INF/dateobject.hbm.xml中指定.我可以看到在mysql客户端中使用"SELECT*FROM dateObjects"在数据库中创建列.MY_DATE已正确填充,但LAST_ACCESSED设置为NULL. …
我想HttpServletResponse在其内容(通常是HTML)呈现之后添加cookie .
正如这里所提到的(http://osdir.com/ml/java.jasig.uportal/2005-10/msg00276.html),这里(在刷新标题后,在Java中为响应添加一个cookie?),这个可以通过缓冲响应来实现它不会被刷新并发送到客户端(因为在将报头发送到客户端之后,响应被提交,并且不再有标头,即cookie头,可以发送到客户端).
假设这是目前的目标:我认为实现这一目标的一种可能方法是使用a HttpServletResponseWrapper,我可以覆盖它的flushBuffer()方法并防止将header\content实际刷新到客户端:
public class BufferedHttpServletResponse extends HttpServletResponseWrapper {
public BufferedHttpServletResponse(HttpServletResponse response) {
super(response);
}
public void flushBuffer() {
}
}
Run Code Online (Sandbox Code Playgroud)
并将此缓冲响应应用于a Filter,以使用过滤器链的其余部分:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
BufferedHttpServletResponse bufferedResponse = new BufferedHttpServletResponse(response);
chain.doFilter(request, bufferedResponse);
// ... create Cookie and add it to response ... response.addCookie(newCookie)
// response.flushBuffer() ?
}
Run Code Online (Sandbox Code Playgroud)
问题:上面还可以,还是完全关闭?响应的缓冲区是否会继续填充内容\标题(并且可能会重新调整大小)直到我 …
我使用的是Spring 3.1.1.RELEASE,Hibernate 4.1.0.Final和JPA 2.0.有没有一种方法可以在没有Java代码的情况下执行事务后将Spring事务配置为提交?换句话说,我想将flush模式设置为在应用程序上下文文件,hibernate配置文件或persistence.xml文件中提交.我的Spring事务服务类看起来像
@Transactional(rollbackFor = Exception.class)
@Service
public class ContractServiceImpl implements ContractService
{
@Autowired
private ContractDAO m_contractDao;
public void addContract(Contract contract)
{
m_contractDao.create(contract);
}
...
Run Code Online (Sandbox Code Playgroud)
我的应用程序上下文设置如此......
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:myproject" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="persistenceXmlLocation" value="classpath*:META-INF/test-persistence.xml"/>
<property name="persistenceUnitName" value="testingDatabase"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sharedEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven /> …Run Code Online (Sandbox Code Playgroud) 冲洗Stream后是否需要冲洗StreamWriter?
public static async Task WriteStringAsync(this Stream stream, string messageString)
{
var encoding = new UTF8Encoding(false); //no BOM
using (var streamWriter = new StreamWriter(stream, encoding))
{
await streamWriter.WriteAsync(messageString);
await streamWriter.FlushAsync();
}
await stream.FlushAsync(); //is this necessary?
}
Run Code Online (Sandbox Code Playgroud) 这个问题:如何保护日志免受应用程序崩溃?引导我到另一个 - std::ofstream::close()实际上做了什么?我知道它的召唤flush(),这是一回事.但还有什么?实际关闭文件的是什么?
编辑:让我重新解释一下我的问题 - 在调用过程中对实际文件做了什么实际操作,close()还是只是std::ofstream内部清理?
后Mark Lakata指出,垃圾无法正常在我的问题我定义想出了这一点.我会保持更新,以避免混淆.
我试图获得一个函数,我可以在提示用户输入之前调用,如printf("Enter your choice:);跟随a,scanf并确保只有在提示后输入的内容才会被scanf作为有效输入扫描.
据我所知,所需的功能是完全冲洗标准输入的东西.这就是我想要的.因此,对于此功能而言"garbage",用户输入中的所有内容,即在该用户提示之前的整个用户输入.
scanf()在C中使用时,总是存在输入缓冲区中存在额外输入的问题.所以我在寻找一个我在每次scanf调用后调用的函数来解决这个问题.我用这个,这个,这个和这个来得到这些答案
//First approach
scanf("%*[^\n]\n");
//2ndapproach
scanf("%*[^\n]%*c");
//3rd approach
int c;
while((c = getchar()) != EOF)
if (c == '\n')
break;
Run Code Online (Sandbox Code Playgroud)
所有这三个都是通过命中试验和参考文献找到的.但是在我的所有代码中使用任何这些代码之前,我想知道这些代码中是否有任何错误?
编辑:
感谢Mark Lakata的第3个错误.我在问题中纠正了它.
EDIT2:
在Jerry Coffin回答之后,我在代码中使用该程序测试了前两种方法:使用GNU GCC编译器阻止IDE 12.11(版本未在编译器设置中声明).
#include<stdio.h>
int main()
{
int x = 3; //Some arbitrary value
//1st one
scanf("%*[^\n]\n");
scanf("%d", &x);
printf("%d\n", x);
x = 3;
//2nd …Run Code Online (Sandbox Code Playgroud) 在以下场景中
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
// Do stuff with it
Run Code Online (Sandbox Code Playgroud)
为什么始终需要在初始创建后刷新缓冲区?
我一直都看到这一点,我真的不明白必须要冲洗什么.除非另有说明,否则我希望新创建的变量为空.
有点像买垃圾桶,在里面找到一堆垃圾.
我想i在我的Jupyter笔记本上打印出来并将其冲洗掉.在下一次迭代之后,我将打印下一次i.我尝试了这个问题和这个问题的解决方案,然而,它只打印出来0123...9而没有为我刷新输出.这是我的工作代码:
import sys
import time
for i in range(10):
sys.stdout.write(str(i)) # or print(i, flush=True) ?
time.sleep(0.5)
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
这些是我的设置:ipython 5.1,python 3.6.也许,我错过了以前的解决方案?
flush ×10
hibernate ×3
spring ×2
c ×1
c# ×1
c++ ×1
cookies ×1
fstream ×1
io ×1
java ×1
jpa ×1
nhibernate ×1
nhibernate-3 ×1
persist ×1
python ×1
save ×1
servlets ×1
stream ×1
streamwriter ×1
transactions ×1