2014-01-13 41 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目錄中,並從你的WebAppConfig中刪除setMappingResources。它是否工作? – gipinani

回答

2

JPA映射文件必須從定義類路徑引用。例如,最好將它們保存在src/main/resources/META-INF中。然後,他們可以是通過提到:

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

因此,我建議移動文件,但與當前的設置,你應該能夠如果配置映像資源僅僅是orm.xml得到它的工作(即剝去WEB-INF/classes前綴

+0

非常感謝「WEB-INF/classes」的學習過程。現在我得到的數據太長createdOn列不知道爲什麼,因爲我已經使用CreatedOn和LastModifiedOn註釋。如果你可以請讓我知道該怎麼做。 我使用喬達日期時間的列和休眠來創建表和列 – Deb

+1

默認情況下,Hibernate將未知類型映射爲blob,這可能不是你想要的。查看http://jadira.sourceforge.net/usertype-userguide.html,瞭解爲JodaTime使用Hibernate特定類型轉換器的庫。或者,您可以在內部使用標準的Date對象,只需在獲取器上公開JodaTime類型並手動執行轉換。 –

+0

thnx很多奧利弗 – Deb