2017-03-07 17 views
4

ElementCllection Listを更新すると、Transection.beginは実行されません.Hibernateは自動的にコミットされますが、テストを行いました。結果には何かがあります間違ったhibernateは@ElementCollectionを自動更新していません

私Main.javaは

public class Main { 

private static UserService userService; 

private static Logger logger = LoggerFactory.getLogger(Main.class); 


public static void main(String[] args) { 
    ApplicationContext applicationContext = 
      new AnnotationConfigApplicationContext(RootConfig.class); 
    userService = applicationContext.getBean(UserService.class); 


    User user = new User("qwerty"); 
    user.getMessages().add("hello,world"); 
    userService.save(user); 
    User user1 = userService.findByName("qwerty"); 
    user1.getMessages().add("ncjdksckds"); 
    System.out.println(user); 
} 

}

で、私の構成は本

@Configuration 
@ComponentScan(basePackages = {"org.zhy"}) 
@EnableJpaRepositories(basePackages = {"org.zhy.repository"}) 
@EnableTransactionManagement 
public class RootConfig { 
    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { 
    LocalContainerEntityManagerFactoryBean emfb = 
      new LocalContainerEntityManagerFactoryBean(); 
    emfb.setDataSource(dataSource); 
    emfb.setJpaVendorAdapter(jpaVendorAdapter); 
    emfb.setPersistenceUnitName("demo"); 
    Properties hibernateProperties = new Properties(); 
    hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); 
    emfb.setJpaProperties(hibernateProperties); 

    emfb.setPackagesToScan("org.zhy.domain"); 
    return emfb; 
} 

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

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource ds = new DriverManagerDataSource(); 
    ds.setDriverClassName("com.mysql.jdbc.Driver"); 
    // some setting here such as url... 
    return ds; 
} 
@Bean 
public JpaVendorAdapter jpaVendorAdapter() { 
    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 
    adapter.setGenerateDdl(false); 
    adapter.setDatabase(Database.MYSQL); 
    adapter.setShowSql(true); 
     adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect"); 
    return adapter; 
} 
に応じてコーディング、ここにあります私は、私は理由を知りたい自動車がそれに新しいメッセージをフラッシュしませんでした user1.getMessages().add("ncjdksckds");
データベースを使用する場合

}

エンティティは、ここに

@Entity 
public class User { 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 
private String name; 
@ElementCollection(fetch = FetchType.EAGER) 
private List<String> messages = new ArrayList<String>(); 
//getter and setter 

です????

+0

メインメソッドで実行中のトランザクションはありません。あなたの 'UserService'メソッドがトランザクションであると思われます。その場合、 'userService.save'が機能しますが、メソッドの外で行っていることはデータベースに永続化されません。サービスメソッドコードを投稿すると便利です。 –

+0

私はそれを解決しました...ありがとう!~~ – lovezhy

答えて

0

あなたが参照している本はわかりませんが、@ ElementCollectionのキーはすべての操作がデフォルトでカスケードされていることです。

サービスには、トランザクションとしてマークされたすべてのパブリックメソッドがあると仮定すると、ユーザーを照会した後、これは分離されたエンティティです。今からトランザクションスコープの外にあるためです。あなたのコードで

は、あなたが戻って永続コンテキストに mergeuser1エンティティが必要になるpersistendその変更を行うために
User user = new User("qwerty"); 
user.getMessages().add("hello,world"); 
userService.save(user); // new transaction start and finish 
User user1 = userService.findByName("qwerty"); // new transaction start and finish 
user1.getMessages().add("ncjdksckds"); // this change is outside of a transaction 

:あなたの中

userService.merge(user1); 

は呼び出します。

entityManager.merge(user); 
関連する問題