2016-05-19 1 views
1

Весна и спящий режим - новые инструменты для меня, и я немного борюсь, используя оба одновременно.Bean property 'entityManager' не доступен для записи или имеет недействительный метод setter (с использованием Spring и Hibernate)

spring.xml:

<bean id="my.supervisionFramesProcess" class="supervision.frames.SupervisionFramesProcess" 
    init-method="startup" destroy-method="shutdown"> 
    <property name="SupervisionDAO"> 
     <bean class="supervision.dao.jpa.JpaSupervisionDao"> 
      <property name="entityManager" ref="my.entity-manager-factory"  /> 
     </bean> 
    </property> 
</bean> 

<bean id="my.dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://XXXX/supervision?autoReconnect=true" /> 
    <property name="username" value="***" /> 
    <property name="password" value="***" /> 
    <property name="maxIdle" value="5" /> 
    <property name="maxActive" value="100" /> 
    <property name="maxWait" value="30000" /> 
    <property name="testOnBorrow" value="true" /> 
    <property name="validationQuery" value="SELECT 1" /> 
</bean> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"></bean> 

<bean id="my.entity-manager-factory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
    <property name="dataSource" ref="my.dataSource" /> 
    <property name="persistenceUnitName" value="SUPERVISION-1.0" /> 
</bean> 

JpaSupervisionDao.xml:

@PersistenceContext(unitName = "SUPERVISION-1.0") 
private EntityManager entityManager; 

public JpaSupervisionDao() { 
    if (logger.isDebugEnabled()) 
     logger.debug("New instance DAO : " + this); 
} 
protected void setEntityManager(EntityManager entityManager) { 
    this.entityManager = entityManager; 
} 
protected EntityManager getEntityManager() { 
    return entityManager; 
} 

@Override 
public SupervisionDbObject selectSupervisionDbObject(SupervisionDbObject supervision) { 
    Query query = getEntityManager().createQuery(SELECT_SUPERVISION); 
} 

persistence.xml:

<persistence-unit name="SUPERVISION-1.0"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>supervision.dao.SupervisionDbObject</class> 
</persistence-unit> 

Использование JDBC, моя DataSource может быть инстанциирован и полностью функционален, но используя Hibernate и entityManager, я получаю ошибку:

Bean property 'entityManager' is not writable or has an invalid setter method. 

Вместо этого я попытался использовать объект EntityManagerFactory, но произошла ошибка.

Может кто-нибудь помочь мне?

+1

Ваш 'setEntityManager' является' protected'. Однако вы должны удалить его и позволить '@ PersistenceContext' выполнять свою работу. Убедитесь, что в вашей конфигурации есть ''. –

+0

Мне действительно нужен , если у меня уже есть компонент, похожий на PersistenceAnnotationBeanPostProcessor? (Добавлено в op) – warzag

+0

Нет, вы этого не сделаете, но '' делает больше, чем только 'PersistenceAnnotationBeanPostProcessor' (например,' @ Autowired'). –

ответ

0

Добавление <context:annotation-config/> исправлено моей проблемой благодаря ответу М. Дейнума.

Если это может помочь кому-то еще, у меня также возникла проблема с импортом, я импортировал org.hibernate.annotations.Entity вместо javax.persistence.Entity.

Смежные вопросы

 Смежные вопросы