der*_*itz 1 java jpa jboss-arquillian
基于原型我创建了一个java ee应用程序.有一个包括arquillian测试运行正常.它只是在@Stateless bean上调用一个持久化实体的方法.
现在我添加了一些实体与一些关系,我为他们写了一个测试.但在坚持任何实体我得到
Transaction is required to perform this operation (either use a transaction or extended persistence context)
Run Code Online (Sandbox Code Playgroud)
我想我需要用@Transactional标记testmethod,但似乎不是在类路径中.在注入的EntityManager上手动调用事务会产生另一个错误.那么如何正确设置这样的测试和依赖.
编辑 Grzesiek D.建议这里有一些细节.这是实体(与其他人联系):
@Entity
public class Booking implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* internal id.
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
/**
* Used for optimistic locking.
*/
@Version
@Column(name = "version")
private int version;
/**
* A booking must have a project related.
*/
@ManyToOne
@JoinColumn(name = "project_id")
@NotNull
private Project project;
/**
* A booking must have an owner.
*/
@ManyToOne
@JoinColumn(name = "user_id")
@NotNull
private User owner;
/**
* A booking always has a start time.
*/
@Column
@NotNull
private Timestamp start;
/**
* A booking always has an end time.
*/
@Column
@NotNull
private Timestamp end;
/**
*
* @return true if start is befor end. false otherwise (if equal or after end).
*/
@AssertTrue(message = "Start must before end.")
public final boolean isStartBeforeEnd() {
return start.compareTo(end) < 0;
}
/**
* @return the id
*/
public final Long getId() {
return id;
}
/**
* @param id
* the id to set
*/
public final void setId(final Long id) {
this.id = id;
}
/**
* @return the version
*/
public final int getVersion() {
return version;
}
/**
* @param version
* the version to set
*/
public final void setVersion(final int version) {
this.version = version;
}
/**
* @return the project
*/
public final Project getProject() {
return project;
}
/**
* @param project
* the project to set
*/
public final void setProject(final Project project) {
this.project = project;
}
/**
* @return the owner
*/
public final User getOwner() {
return owner;
}
/**
* @param owner
* the owner to set
*/
public final void setOwner(final User owner) {
this.owner = owner;
}
/**
* @return the start
*/
public final Timestamp getStart() {
return start;
}
/**
* @param start
* the start to set
*/
public final void setStart(final Timestamp start) {
this.start = start;
}
/**
* @return the end
*/
public final Timestamp getEnd() {
return end;
}
/**
* @param end
* the end to set
*/
public final void setEnd(final Timestamp end) {
this.end = end;
}
//hashCode, equals, toString omitted here
}
Run Code Online (Sandbox Code Playgroud)
这是测试:
@RunWith(Arquillian.class)
public class BookingTest {
@Deployment
public static Archive<?> createDeployment() {
return ArquillianContainer.addClasses(Resources.class, Booking.class, Project.class, User.class);
}
@Inject
private EntityManager em;
@Test
public void createBooking() {
Booking booking = new Booking();
booking.setStart(new Timestamp(0));
booking.setEnd(new Timestamp(2));
User user = new User();
user.setName("Klaus");
booking.setOwner(user);
Project project = new Project();
project.setName("theOne");
project.setDescription("blub");
booking.setProject(project);
em.persist(booking);
System.out.println("here");
}
}
Run Code Online (Sandbox Code Playgroud)
这里有例外:
javax.persistence.TransactionRequiredException: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)
Run Code Online (Sandbox Code Playgroud)
我知道如果我创建一个@Stateless bean并在那里封装持久化,但我想要实体验证的直接测试,我需要一个游乐场来改进数据模型.
小智 10
In order to have transaction support in Arquillian tests you will need to bring in extension which enables this feature. In your case jta dependency should do the job.
<dependency>
<groupId>org.jboss.arquillian.extension</groupId>
<artifactId>arquillian-transaction-jta</artifactId>
<scope>test</scope>
</dependency>Run Code Online (Sandbox Code Playgroud)
In addition, if you are using JBoss, you will need to provide its JNDI for UserTranscation, so put following section in your arquillian.xml:
<?xml version="1.0" ?>
<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jboss.org/schema/arquillian" xsi:schemaLocation="http://jboss.org/schema/arquillian
http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
<extension qualifier="transaction">
<property name="manager">java:jboss/UserTransaction</property>
</extension>
</arquillian>
Run Code Online (Sandbox Code Playgroud)
This way you can use @Transactional which comes from this extension's API.
| 归档时间: |
|
| 查看次数: |
1987 次 |
| 最近记录: |