Java – hibernate does not automatically update the @ elementcollection
According to the book, I update a list of elementcollection, I don't do transition Begin, hibernate will submit automatically, but I tested it and found an error
My main Java is
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);
}
}
My configuration is here, according to the code of the book
@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;
}
}
The entity is here
@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
When I use user1 getMessages(). add(“ncjdksckds”); The database does not automatically print new messages into it. I want to know why????
Solution
I'm not sure which book you mean, but in your case, the key to @ elementcollection is that all operations are cascaded by default
Suppose your service marks all public methods as transactional. After querying users, it is a separate entity Because it is outside the scope of any transaction from now on
In your code:
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
To persist the changes, you need to merge the user1 entity back into the persistence context:
userService.merge(user1);
Inside you will call:
entityManager.merge(user);
