2014-01-13 12 views
1

Я пытаюсь использовать аудит, представленного jpa.Below весны данных моего webappconfigSPRING-DATA-JPA Простой аудит не работает

@Configuration 
@EnableWebMvc 
@EnableTransactionManagement 
@ComponentScan("com.astrika.kernel") 
@PropertySource("classpath:application.properties") 
@EnableJpaRepositories(basePackages="com.astrika.kernel.repository") 
@EnableJpaAuditing 

public class WebAppConfig { 

private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 


private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan"; 

private static final String PROPERTY_NAME_HIBERNATE_POST_INSERT = "hibernate.ejb.event.post-insert"; 
private static final String PROPERTY_NAME_HIBERNATE_POST_UPDATE = "hibernate.ejb.event.post-update"; 
private static final String PROPERTY_NAME_HIBERNATE_POST_DELETE = "hibernate.ejb.event.post-delete"; 
private static final String PROPERTY_NAME_HIBERNATE_PRE_COLLC_UPDATE = "hibernate.ejb.event.pre-collection-update"; 
private static final String PROPERTY_NAME_HIBERNATE_PRE_COLLC_REMOVE = "hibernate.ejb.event.pre-collection-remove"; 
private static final String PROPERTY_NAME_HIBERNATE_PRE_COLLC_RECREATE = "hibernate.ejb.event.post-collection-recreate"; 

@Resource 
private Environment env; 

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

    dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
    dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
    dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
    dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 

    return dataSource; 
} 

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactoryBean.setDataSource(dataSource()); 
    entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class); 
    entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 
    entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter()); 
    entityManagerFactoryBean.setMappingResources("WEB-INF/classes/orm.xml"); 
    //  entityManagerFactoryBean.setJpaProperties(hibProperties()); 

    return entityManagerFactoryBean; 
} 

// private Properties hibProperties() { 
//  Properties properties = new Properties(); 
//  properties.put(PROPERTY_NAME_HIBERNATE_POST_INSERT, 

// env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_POST_INSERT)); 
//  properties.put(PROPERTY_NAME_HIBERNATE_POST_UPDATE, 

// env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_POST_UPDATE)); 
//  properties.put(PROPERTY_NAME_HIBERNATE_POST_DELETE, 

// env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_POST_DELETE)); 
//  properties.put(PROPERTY_NAME_HIBERNATE_PRE_COLLC_UPDATE,  

// env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_PRE_COLLC_UPDATE)); 
//  properties.put(PROPERTY_NAME_HIBERNATE_PRE_COLLC_REMOVE,  

// env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_PRE_COLLC_REMOVE)); 
//  properties.put(PROPERTY_NAME_HIBERNATE_PRE_COLLC_RECREATE, 

// env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_PRE_COLLC_RECREATE)); 
//  return properties; 
// } 
@Bean 
    public JpaVendorAdapter jpaVendorAdapter() { 
     HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new 

HibernateJpaVendorAdapter(); 

     hibernateJpaVendorAdapter.setShowSql(false); 
     hibernateJpaVendorAdapter.setGenerateDdl(true); 
     hibernateJpaVendorAdapter.setDatabase(Database.MYSQL); 
     return hibernateJpaVendorAdapter; 
    } 

@Bean 
public JpaTransactionManager transactionManager() { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
    return transactionManager; 
} 

@Bean 
public UrlBasedViewResolver setupViewResolver() { 
    UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
    resolver.setPrefix("/pages/"); 
    resolver.setSuffix(".jsp"); 
    resolver.setViewClass(JstlView.class); 
    return resolver; 
} 

@Bean 
public ResourceBundleMessageSource messageSource() { 
    ResourceBundleMessageSource source = new ResourceBundleMessageSource(); 
    source.setBasename(env.getRequiredProperty("message.source.basename")); 
    source.setUseCodeAsDefaultMessage(true); 
    return source; 
} 

и мой orm.xml выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" 
    version="2.0"> 

<persistence-unit-metadata> 
    <persistence-unit-defaults> 
     <entity-listeners> 
      <entity-listener class="org.springframework.data.jpa.domain.support.AuditingEntityListener" /> 
     </entity-listeners> 
    </persistence-unit-defaults> 
</persistence-unit-metadata> 

Если когда-нибудь я бегу мое приложение на моем сервере Tomcat я получаю ошибку

INFO: HHH000360: Unable to resolve mapping file [WEB-INF/classes/orm.xml] 

И области аудита, такие как createdOn, lastModifiedOn никогда не получают значение. Они всегда равны нулю. Пожалуйста, помогите, как я могу получить вышеупомянутую ошибку tomcat? и отвечает ли он за нулевые значения в областях аудита? и у меня больше нет конфигурации?

Я забыл упомянуть, я использую аннотации на основе аудит, т.е. @CreatedOn и @LastModifiedOn

+0

Является ли ваш файл orm.xml в файле META-INF/orm.xml? – gipinani

+0

нет его ресурсов, которые после развертывания отправляются в web-inf/classes/ – Deb

+0

Попробуйте поместить ваш orm.xml в src/main/resources в каталоге META-INF и удалите setMappingResources из вашего WebAppConfig. Это работает? – gipinani

ответ

2

картографирование JPA файлы должны быть ссылками из определения по классам. Таким образом, лучше держать их в src/main/resources/META-INF, например. Затем они могут быть отнесены к сквозному:

emfb.setMappingResources("META-INF/orm.xml"); 

Так что я рекомендую переместить файл, но с вашей текущей настройки, вы должны быть в состоянии заставить его работать, если настроить отображение ресурса просто быть orm.xml (т.е. сдирать WEB-INF/classes prefix.

+0

Thanx много чувак, отделяющий «WEB-INF/classes», работал как шарм. Теперь я слишком долго получаю данные для столбца createdOn, не знаю, почему, поскольку я использовал аннотации для CreateOn и LastModifiedOn. Если вы можете, пожалуйста, дайте мне знать, что делать. Я использую дату и время Joda для столбцов и спящего режима для создания таблиц и столбцов. – Deb

+1

По умолчанию Hibernate отображает неизвестные типы как blob, что, вероятно, не то, что вы хотите. Взгляните на http://jadira.sourceforge.net/usertype-userguide.html для библиотеки с конвертерами типа Hibernate для JodaTime. Кроме того, вы можете использовать стандартные объекты 'Date' внутри и просто выставлять типы JodaTime на геттеры и вручную выполнять преобразование. –

+0

Thnx много Оливер – Deb

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