集成JPA2.0和Spring

时间:2010-08-02 14:40:13

标签: java hibernate spring jpa orm

最后几个小时我尝试用spring jpa 2.0 3.0进行测试 最后我可以恢复持久化的对象 但是当我尝试持久保存新对象时,我收到以下错误消息:

  

org.springframework.dao.InvalidDataAccessApiUsageException:没有正在进行的交易;嵌套异常是javax.persistence.TransactionRequiredException:没有事务正在进行中       在org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:306)       在org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:102)       在org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)       在org.springframework.orm.jpa.JpaAccessor.translateIfNecessary(JpaAccessor.java:152)       在org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:188)       在org.springframework.orm.jpa.JpaTemplate.flush(JpaTemplate.java:288)       at myPackage.testDAO.create(testDAO.java:33)       在myPackage.Main.main(Main.java:27)   引起:javax.persistence.TransactionRequiredException:没有事务正在进行中       在org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:789)       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)       在java.lang.reflect.Method.invoke(Method.java:597)       在org.springframework.orm.jpa.ExtendedEntityManagerCreator $ ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)       在$ Proxy21.flush(未知来源)       在org.springframework.orm.jpa.JpaTemplate $ 8.doInJpa(JpaTemplate.java:290)       在org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:183)       ......还有3个

我的实体bean:

@Entity public class Application实现Serializable {     private static final long serialVersionUID = 1L;

@Id
@Column(name="ID_APPLICATION")
private long idApplication;

@Temporal( TemporalType.DATE)
@Column(name="DATE_LIVRAISON")
private Date dateLivraison;

@Lob()
private String description;

@Column(name="NOM_APPLICATION")
private String nomApplication;

private String url;

//bi-directional many-to-one association to Test
@OneToMany(mappedBy="application")
private List<Test> tests;

public Application() {
}

public long getIdApplication() {
    return this.idApplication;
}

public void setIdApplication(long idApplication) {
    this.idApplication = idApplication;
}

public Date getDateLivraison() {
    return this.dateLivraison;
}

public void setDateLivraison(Date dateLivraison) {
    this.dateLivraison = dateLivraison;
}

public String getDescription() {
    return this.description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getNomApplication() {
    return this.nomApplication;
}

public void setNomApplication(String nomApplication) {
    this.nomApplication = nomApplication;
}

public String getUrl() {
    return this.url;
}

public void setUrl(String url) {
    this.url = url;
}

public List<Test> getTests() {
    return this.tests;
}

public void setTests(List<Test> tests) {
    this.tests = tests;
}

}

我的存储库:

@Repository 公共类testDAO扩展JpaDaoSupport实现ItestDAO {     @PersistenceContext     私有EntityManager em;

public List<Application> findALL() {
    // TODO Auto-generated method stub
    return null;
}

public Application findById(long id) {
    // TODO Auto-generated method stub
    return getJpaTemplate().find(Application.class, id);
}

public void create(Application application) {
    getJpaTemplate().persist(application);
}

}

findById方法正常工作(这让我确信jpa配置是正确的),但是当我运行create方法时,我收到上面的错误信息。

ApplicationContext context=new ClassPathXmlApplicationContext("application-context.xml");
    testDAO dao=(testDAO)context.getBean("dao");
    Application application=new Application();
    application.setIdApplication(2);
    application.setUrl("url");
    application.setDescription("description");
    application.setNomApplication("dsdsds");
    dao.create(application);

任何帮助表示赞赏 谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

简而言之,EntityManager的方法,例如persistremovemerge必须在事务中调用,因此错误消息实际上是自我解释:< / p>

javax.persistence.TransactionRequiredException: no transaction is in progress

Spring为事务管理提供支持(参见下面的链接),包括编写测试时...如果你使用提供transactional support的Spring测试类之一。

另见