我有一个实体类,如下所示:
@Entity
@Table(name = "MY_TABLE")
public class MyEntity implements Serializable {
@Id
@Column(name = "ID")
@XmlAttribute
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@Column(name = "NAME")
@XmlAttribute
private String name;
public String getId() {
return id;
}
public void setId(final String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name= name;
}
}
此实体由此类持久保存:
public class MyStarter {
@PersistenceContext(unitName = "myUnit")
private EntityManager manager;
public void insertIntodb() {
final MyEntity entity = new MyEntity();
entity.setName("Sample");
manager.persist(entity);
}
}
但是,每当执行上面的持久代码时,我都会遇到异常:
javax.persistence.TransactionRequiredException: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)
为了尝试解决这个问题,我在这里做了一些事情来验证哪些有效,哪些无效:
我已验证用户与数据库的连接是否具有写入权限。
我已经验证选择数据的本机查询确实可以从JPA执行并返回结果。
我在@PersistanceContext注释中添加了type = javax.persistence.PersistenceContextType.EXTENDED
我已更新persistance.xml文件以包含以下行:
<jta-data-source>java:jboss/datasources/Mysource</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.id.new_generator_mappings" value="true" />
<property name="hibernate.connection.isolation" value="2" />
<property name="hibernate.default_schema" value="dbo" />
<property name="hibernate.transaction.flush_before_completion"
value="true" />
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
</properties>
然而,我仍然无法摆脱这个问题。我在这里找不到任何明显的东西?
答案 0 :(得分:1)
使用@Transactional
,如下所示
@Transactional
public class MyStarter {
...
或作为
@Transactional
public void insertIntodb() {
final MyEntity entity = new MyEntity();
entity.setName("Sample");
manager.persist(entity);
}
这是因为persist()
保证如果在事务边界之外调用它,不执行INSERT/UPDATE
语句。
因此,您需要一个事务来在db中保存对象,同时使用persist()
。
在Spring上下文文件中,您需要添加以下代码:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<tx:annotation-driven />
您可以使用persist()
代替save()
。 save()
方法可以在事务内部或外部执行。在使用扩展的会话/持久性上下文的长时间对话中,使用save()
不良好。