java - SPRING-DATA-JPA 简单审计不起作用

标签 java spring hibernate jpa spring-data

我正在尝试利用 spring data jpa 提供的审核。下面是我的 webappconfig

@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

最佳答案

根据定义,JPA 映射文件必须从类路径中引用。因此,最好将它们保存在 src/main/resources/META-INF 中。然后可以通过以下方式引用它们:

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

因此,我建议移动该文件,但根据您当前的设置,如果您将映射资源配置为简单的 orm.xml (即剥离 WEB -INF/classes 前缀。

关于java - SPRING-DATA-JPA 简单审计不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21090889/

相关文章:

java - 单表策略在 Hibernate 中不起作用

java - 使用自定义的面向 Servlet 的框架,servlet 太多,这是一个问题吗

java - sessionfactory.openSession() 和 sessionfactory.openStatelessSession() 的区别?

java - Hibernate 多对多更新

java - Spring Boot 连接两个具有无效 FK 条目的实体

java - Kafka Broker 问题 - UnknownServerException

java - 如何配置maven hbm2hbmxml和hbm2java在mvn clean install中依次运行

java - 在连接PC的移动设备上读写数据

java - 覆盖 Struts 应用程序中的默认 ResourceBundle

java - 通过解码文件的编码字符串格式从数据库下载文件