Привет, вообщем использую Spring 3.0.0 Release, Derby - как базу данных ну и JPA + Hibernate.... вообщето хочу подключить использование JOTM для транзакций, но решил что пока обойдусь JpaTransactionManager... проблема в том что данные просто не попадают в базу и никаких иксепшинов на консоле нету. мой persistence.xml | Код | <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_1_0.xsd" version="1.0">
<persistence-unit name="persistence-derby" transaction-type="RESOURCE_LOCAL"> <!--provider>org.hibernate.ejb.HibernatePersistence</provider --> <class>model.User</class> <!-- Apache Derby (JavaDB) --> <properties> <property name="hibernate.archive.autodetection" value="class" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/> <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="hibernate.connection.url" value="jdbc:derby:/database/jpa-test-database;create=true"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
|
| Код | @Entity @Table(name = "Users") @SequenceGenerator(name = "SEQ_USER", sequenceName = "USER_ID_SEQUENCE") public class User implements Serializable{
private Long id; private String username; private String password; private Enum role;
@Id @GeneratedValue(generator = "SEQ_USER") @Column(name = "id") public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
@Column(name = "username") public String getUsername() { return username; }
public void setUsername(String username) { this.username=username; }
@Column(name = "password") public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
@Enumerated(EnumType.STRING) @Column(name = "role") public Enum getRole() { return role; }
public void setRole(Enum role) { this.role = role; } }
|
клас UserDAO | Код | public class UserDAO extends AbstarctUserDAO { public void insertUser(User user) { getEntityManager().persist(user);
}
public User getUser(String name) { Query query = getEntityManager().createQuery("FROM User user WHERE user.username = :username"); query.setParameter("username", name); return (User) query.getSingleResult(); }
public boolean removeUser(User user) { User userx = getEntityManager().find(User.class, user.getId()); getEntityManager().remove(userx); return true; }
}
|
код AbstractUserDAO | Код | public abstract class AbstractUserDAO implements IGenericDAO{
private EntityManager entityManager; @PersistenceContext public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; }
protected EntityManager getEntityManager() { if (entityManager == null) throw new IllegalStateException( "EntityManager has not been set on DAO before usage"); return entityManager; } }
|
конфигурация спринг.xml: | Код | <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="persistence-derby"/> <!--property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml"/> <property name="persistenceProvider"> <bean class="org.hibernate.ejb.HibernatePersistence"/> </property --> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="DERBY" /> <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect"/> <property name="showSql" value="true"/> <property name="generateDdl" value="false"/> </bean> </property>
</bean> <bean id="userDAO" class="dao.UserDAO"/> <bean id="userService" class="service.UserService"> <property name="userDAO" ref="userDAO"/> </bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="singleton"> <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"/> <property name="url" value="jdbc:derby:/database/jpa-test-database"/> <property name="username" value=""/> <property name="password" value=""/> </bean>
<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> <property name="dataSource" ref="dataSource"/> </bean>
<tx:annotation-driven transaction-manager="jpaTransactionManager"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
|
ну и сам сервис собственно (тут у меня закоменчен предыдущий подход не через txadvice): | Код | public class UserService extends AbstractService{
IGenericDAO userDAO;
public IGenericDAO getUserDAO() { return userDAO; }
public void setUserDAO(IGenericDAO userDAO) { this.userDAO = userDAO; }
@Transactional public void insertUser(User user){ // TransactionStatus transactionStatus = startTransaction(); userDAO.insertUser(user); //commitTransaction(transactionStatus); } @Transactional public User getUser(String name){ //TransactionStatus transactionStatus = startTransaction(); User user = getUserDAO().getUser(name); //commitTransaction(transactionStatus); return user; }
@Transactional public boolean removeUser(User user){ //TransactionStatus transactionStatus = startTransaction(); boolean result = getUserDAO().removeUser(user); //commitTransaction(transactionStatus); return result; } }
|
Запускается это дело следующим образом (имеется тест), который не выдает никакого иксепшина, но видно что данные не записываются в таблицу, поскольку тест возвращает иксепшин javax.persistence.NoResultException: No entity found for query: | Код | protected String[] getConfigLocations() { return new String[] { "applicationContext-business.xml"}; } public void testFindUserById() {
User user = new User(); user.setUsername("hello885"); user.setPassword("12345"); user.setRole(Role.USER); getUserService().getUserDAO().insertUser(user); User createdUser = getUserService().getUserDAO().getUser("hello885"); assertNotNull(createdUser); }
|
Главное что данные вроде выбирает с таблицы нормально, тоесть код | Код | User createdUser = getUserService().getUserDAO().getUser("hello885");
|
работает, если руками там чего то добавить в базу, он юзера возвращает... ну вот почему данные в таблицу не попадают - не могу знать... точно где-то что-то нехорошо из конфигурацией JpaTransactionManager, но вот не знаю что... может кто сталкивался с такой проблемой... Заранее спасибо!!!
|