我的DAO集成测试失败,因为在测试期间创建的实体在下一次测试开始时仍在数据库中.MySQL 5和H2都可以看到完全相同的行为.
测试类注释为:
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( { "/testPersist-applicationContext.xml" })
Run Code Online (Sandbox Code Playgroud)
测试应用程序上下文中的事务bean配置如下:
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
Run Code Online (Sandbox Code Playgroud)
实体管理器配置如下:
<bean id="myappTestLocalEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp" />
<property name="persistenceUnitPostProcessors">
<bean class="com.myapp.core.persist.util.JtaPersistenceUnitPostProcessor">
<property name="jtaDataSource" ref="myappPersistTestJdbcDataSource" />
</bean>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="database" value="$DS{hibernate.database}" />
<property name="databasePlatform" value="$DS{hibernate.dialect}" />
</bean>
</property>
<property name="jpaProperties"> …Run Code Online (Sandbox Code Playgroud) 我有一个相当大的(新)项目,其中我们使用JPA映射注释了许多域类.现在是时候实现许多命名查询 - 一些实体可能有多达15-20个命名查询.我认为在注释中编写这些命名查询会使源文件混乱,因此我正在考虑将这些查询放在XML映射文件中.
这可能吗?
重要的是,这是否合理?
有更好的方法吗?
这是怎么做到的?
我的域类中有一些OneToMany子集合,它们可能会随着时间的推移而增长,以容纳数百或(很可能)数千个实例。然而,通常父母真正需要的只是“第一个”孩子或“最后一个”孩子或“最大”的孩子。让父实例循环遍历从数据库加载的大量对象集合似乎效率很低。
另一方面,我不想因为持久性问题而污染我的域模型,并开始必须在域类中使用我的 DAO 来执行查询。
我可能会将这些查找放在我的服务方法中,但我真的更喜欢将此登录名放在它所属的域中 - 试图避免“贫血域”反模式。
有没有一种方法可以从大集合中提取“特定”对象而不直接调用 DAO?我忽略了一些 JPA ORM 映射功能?
编辑: 应用程序是分层设计的,域模型层位于底部——它不依赖于其他任何东西。接下来是持久层,它实现 DAO 并依赖于域层。在它们之上是一个服务层,我试图通过将业务逻辑下推到域层来使其尽可能薄。
背景:
我有一个Flex Web应用程序,通过BlazeDS与Java后端进行通信.Flex客户端由一个flex-client模块和一个独立的flex-service模块组成,该模块包含视图和表示模型,这些模块包含模型(值对象)和服务对象.
我正在使用FlexUnit4为flex-service模块的RemoteObjects编写异步集成测试.在某些测试中,我修改测试数据并查询它以查看是否一切正常(此处显示的技术:http://saturnboy.com/2010/02/async-testing-with-flexunit4)
题:
在每个FlexUnit4测试方法(或测试方法链)之前,如何将数据库重置为已知状态?在我的Java服务器集成测试中,我通过DBUnit和Spring Test的事务的组合来做到这一点 - 在每个测试方法之后回滚.但是,这些Flexunit集成跨越多个请求,从而跨越多个事务.
如果没有在后端实现集成测试服务API,那么如何实现呢?当然其他人也遇到过这个问题?之前已经提出了类似的问题(集成后的回滚数据库(Selenium)测试),但没有令人满意的答案.
我有一个动态的Actionscript类,如下所示:
public dynamic class Foo {....}
Run Code Online (Sandbox Code Playgroud)
在我的代码中我(可能)添加一些属性:
myFoo["myNewDynamicProp"] = "bar";
Run Code Online (Sandbox Code Playgroud)
在我的代码的其他地方,给定一个类Foo的实例,如何确定是否已添加该动态属性而不抛出昂贵的异常?
这是一个真正的新手的基本Java问题.我有一组Java对象(类"MyClass")实现某个接口(接口"MyIfc").我有一组这些对象存储在我的类中的私有变量中,声明如下:
protected Set<MyClass> stuff = new HashSet<MyClass>();
Run Code Online (Sandbox Code Playgroud)
我需要提供一个公共方法,将此集作为"MyIfc"类型的对象集合返回.
public Collection<MyIfc> getMyStuff() {...}
Run Code Online (Sandbox Code Playgroud)
我该如何进行转换?以下行给出了一个错误,它无法进行转换.我猜想编译器知道类MyClass的对象实现了MyIfc,因此会处理它.
Collection<MyIfc> newstuff = stuff;
Run Code Online (Sandbox Code Playgroud)
任何启示都表示赞赏.
在我调整架构时,在我看来,在多个小数据集中传播测试数据会产生维护问题.有人看到创建一个更大的测试数据集的问题?通过"更大",我仍然只谈论几百条记录.
通过 Spring 配置 Atomikos 时,不需要 jta.properties 或 transactions.properties 文件。尽管如此,Atomikos 启动时会打印以下消息到 stderr:
No properties path set - looking for transactions.properties in classpath...
transactions.properties not found - looking for jta.properties in classpath...
Failed to open transactions properties file - using default values
Run Code Online (Sandbox Code Playgroud)
它使它看起来好像没有使用 Spring 配置——尽管显然一切都很好。有谁知道如何摆脱这个,所以我最终不会被问到 1.000 次?
有没有办法从特定组件或 jar 重定向 stderr?
由于版本v2.3.2中修复的maven-compiler-plugin v2.0.2中的错误,我只丢失了2个小时的时间.
显然,如果您没有指定Maven编译器插件的版本,Maven 2.2.1只会为您提供v2.0.2.
我们的项目使用15个以上的Maven插件.其中一些我们想要确定某个版本,但其中大部分(如编译器插件)我们想升级而不必考虑它.
有没有办法使用Maven自动执行此操作,或者我们是否必须指派某人每月研究可能的Maven插件升级,然后在我们的父POM中更改PluginManagement版本号的费力不讨好的任务?
我们的应用程序使用Ext.grid.Panel显示数据行.当用户单击"新建..."按钮时,我们将向网格存储添加新记录.一切都很好.
但是,在某些字段中,仅仅是这些新的(尚未)未记录的记录,我们希望在某些单元格中显示特定的空文本.例如:'在此输入标题'或'选择平台'.
我知道Column上有一个emptyCellText属性,但是a)它被破坏了,b)我想只在新的,未同步的(例如幻像)记录上发生这种情况.
由于我是这个框架的新手,所以任何想法都是最受欢迎的.