2017-04-21 19 views
1

私は初めてSpringデータを使用しようとしています。実装するSpring用のリポジトリインタフェースを作成しました。私はfindAll()メソッドを使用しており、うまく動作します。しかし、save()delete()のメソッドは期待どおりに動作しません。データは保持されませんが、例外はスローされません。春のデータ - データはロードされても保存されません。

ハイバネートコードでデバッグしようとしましたが、イベントEntityDeleteAction[com.my.test.City#2]がActionQueueに追加されていますが、その​​メソッドは呼び出されません。そして私はその理由を知ることはできませんでした。

お願いします。以下は、データベースの作成コード、Javaの設定、私のエンティティとリポジトリのコードです:

CREATE TABLE cities(
    id SERIAL PRIMARY KEY, 
    name VARCHAR(45) NOT NULL UNIQUE 
); 
INSERT INTO cities(id, name) VALUES (1, 'Moscow'); 
INSERT INTO cities(id, name) VALUES (2, 'St.Petersburg'); 

City.javaを

@Entity 
@Table(name = "cities") 
public class City { 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long id; 
    public String name; 
} 

CityRepository.java:

@Repository 
public interface CityRepository extends CrudRepository<City, Long> {} 

AppConfig.java(一部)

@EnableWebMvc 
@Configuration 
@ComponentScan(value = ...) 
@EnableJpaRepositories("com.my.test.repository") 
@Import(value = { 
     SecurityConfig.class, 
     WebMvcConfig.class 
}) 
@PropertySource("classpath:db.properties") 
@EnableTransactionManagement 
public class AppConfig extends WebSecurityConfigurerAdapter 

@Bean 
DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(env.getProperty("db.driver")); 
    dataSource.setUrl(env.getProperty("db.url")); 
    dataSource.setUsername(env.getProperty("db.username")); 
    dataSource.setPassword(env.getProperty("db.password")); 
    return dataSource; 
} 

@Bean 
SessionFactory sessionFactory() { 
    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource()); 
    sessionBuilder.scanPackages("com.my.test"); 
    sessionBuilder.addProperties(getHibernateProperties()); 
    return sessionBuilder.buildSessionFactory(); 
} 

@Bean 
PlatformTransactionManager transactionManager() { 
    return new HibernateTransactionManager(sessionFactory()); 
} 

@Bean 
LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setDataSource(dataSource()); 
    em.setPackagesToScan(
      "com.my.test.repository", 
      "com.my.test.entity" 
    ); 
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
    return em; 
} 

private Properties getHibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql")); 
    properties.put("hibernate.dialect", env.getProperty("hibernate.dialect")); 
    return properties; 
} 

方法I実行:

cityRepository.delete(2); 

ありがとうございます!

+0

どこが ''このcityRepository.delete(2)を実行していることから、 –

+2

間違ったトランザクションマネージャを使用しています。 JPAを使用しているので、 'HibernateTransactionManager'ではなく' JpaTransactionManager'を使う必要があります。 –

+0

M.デニウム、そうですよ!これは助けになりました。私は解決策としてそれをマークすることができるように答えとして投稿しますか? – awfun

答えて

1

M. Deinumが書いたように、問題は間違ったトランザクションマネージャで発生していました。これは、ソリューションでした:

削除豆sessionFactory()

は豆を置き換える:

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

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setDataSource(dataSource()); 
    em.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
    em.setPackagesToScan(
      "com.my.test.repository", 
      "com.my.test.entity" 
    ); 
    em.setJpaProperties(getHibernateProperties()); 
    return em; 
} 
+0

私は 'com.my.test.entity'の代わりに 'AClassFromThatPackage.class.getPackage()。getName()'を使用します。このようにリファクタリングするのは脆弱ではありません。 –

+0

良いアイデア、Tomas、私はいつもこれらの文字列リテラルを嫌っていました – awfun

関連する問題