2011-07-12 56 views
0

我有一個Spring和JPA的問題。基本上,我嘗試使用Spring的JPA和純粹的方法,或者更好,沒有在Spring框架的代碼中顯式引用,但@Transactional除外。所以我想知道哪裏錯了。 我的persistence.xml是:Spring with JPA pure approch

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="fb-persistence" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <class>it.synclab.fb.jpa.entity.Plugin</class> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
      <!-- da utilizzare solo in caso di creazione dello schema <property name="hibernate.hbm2ddl.auto" value="create-drop"/>--> 
      <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.connection.username" value="flussibatch"/> 
      <property name="hibernate.connection.password" value="caposele"/> 
      <property name="hibernate.connection.url" value="jdbc:oracle:thin:@localhost:1521:XE"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我的ApplicationContext需要:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="fb-persistence" /> 
    </bean> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 
    <bean name="pluginDao" class="it.synclab.fb.jpa.dao.impl.PluginDaoImpl" /> 
</beans> 

我的DAO接口:

import it.synclab.fb.jpa.entity.Plugin; 

public interface PluginDao { 

    public Plugin load (int id); 

    public void save(Plugin plg); 
} 

和我的實現是:

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import org.springframework.transaction.annotation.Transactional; 
import it.synclab.fb.jpa.entity.Plugin; 


public class PluginDaoImpl implements PluginDao { 

    private EntityManager entityManager; 

    @PersistenceContext (unitName="fb-persistence") 
    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    @Override 
    public Plugin load(int id) { 
     return entityManager.find(Plugin.class, id); 
    } 

    @Override 
    @Transactional 
    public void save(Plugin plg) { 
     entityManager.persist(plg);  
    } 
} 

這是米Y「恐怖」:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: fb-persistence] Unable to configure EntityManagerFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at it.synclab.fb.jpa.test.PluginTest.main(PluginTest.java:26) 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: fb-persistence] Unable to configure EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:378) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48) 
    at org.springframework.orm.jpa.LocalEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalEntityManagerFactoryBean.java:92) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 
    ... 12 more 
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: it.synclab.fb.jpa.entity.StoreFileGet.idTransaction in it.synclab.fb.jpa.entity.Transaction.listStoreFileGet 
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:685) 
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:645) 
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:65) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1689) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1396) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1348) 
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1522) 
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:282) 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:366) 
    ... 18 more 
+0

這個異常說你休眠映射不正確,春天沒有問題。 – Augusto

回答

1

所致:org.hibernate.AnnotationException:的mappedBy引用 未知目標實體屬性: it.synclab.fb.jpa.entity.StoreFileGet.idTransaction在 it.synclab.fb.jpa.entity。 Transaction.listStoreFileGet

這意味着,在你的實體,你有這樣的

@OneToMany(mappedBy="something") 

的註釋在這種情況下,「東西」已成爲relev名另一個實體的螞蟻場。

+0

你很快就可以發佈答案;) – Kowser

+0

感謝,也許是來自精疲力竭沒有讀到恐怖:P現在我們有了,我可以問我是否一切正確嗎?也就是說,無論如何,我需要將一個類屬性定義爲一個EntityManager? – giulius

+0

朋友,我發佈了調用save方法時未提交的代碼,爲什麼? – giulius

0

你只是把it.synclab.fb.jpa.entity.Plugin實體在你的persistence.xml,但這實體有關聯到其他實體(it.synclab.fb.jpa.entity.StoreFileGet),這是沒有上市。所有實體都必須列出。