2017-03-07 78 views
4

根據本書當我更新ElementCOllection列表時,我不做Transection.begin,休眠會自動提交,但我做了一個測試,結果有東西錯休眠沒有自動更新@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; 
} 
編碼

}

實體在這裏

@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 

當我使用user1.getMessages().add("ncjdksckds");
數據庫沒有自動刷新新郵件到了,我想知道爲什麼????

+0

您的主方法中沒有任何事務正在運行。我懷疑你的'UserService'方法是事務性的。在這種情況下,'userService.save'可以工作,但是不管你在方法之外做什麼都不會被保存到數據庫中。如果你發佈你的服務方法代碼將會很有幫助。 –

+0

我解決了它......謝謝!~~ – lovezhy

回答

0

不確定你所指的是哪本書,但在你的情況下關於@ElementCollection的關鍵是所有操作默認級聯。

假設您的服務將所有公共方法標記爲事務性,在查詢用戶之後,它是一個分離的實體..因爲它從現在開始在任何事務性範圍之外。

在您的代碼:

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 

爲了使這種改變persistend你需要mergeuser1實體回持久化上下文:

userService.merge(user1); 

在裏面你會打電話:

entityManager.merge(user);