Java 冬眠没有';t自动更新@ElementCollection
根据我更新ElementCOllection列表时的书,我没有执行Transsection.begin,hibernate将自动提交,但我对其进行了测试,结果有问题 我的Main.java是Java 冬眠没有';t自动更新@ElementCollection,java,hibernate,jpa,Java,Hibernate,Jpa,根据我更新ElementCOllection列表时的书,我没有执行Transsection.begin,hibernate将自动提交,但我对其进行了测试,结果有问题 我的Main.java是 public class Main { private static UserService userService; private static Logger logger = LoggerFactory.getLogger(Main.class); public static void mai
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
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名称;
@ElementCollection(fetch=FetchType.EAGER)
私有列表消息=新的ArrayList();
//接二连三
当我使用user1.getMessages().add(“ncjdksckds”);
数据库没有自动将新消息刷新到其中,我想知道为什么???不确定您指的是哪本书,但您案例中@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
为了使更改持久化,您需要将user1
实体合并回持久化上下文:
userService.merge(user1);
在里面你会说:
entityManager.merge(user);
你的主方法中没有运行任何事务。我怀疑你的UserService
方法是事务性的。在这种情况下,UserService.save
会起作用,但是你在该方法之外所做的任何事情都不会被持久化到数据库中。如果你发布你的服务方法代码,这会很有帮助。我解决了它…谢谢你你~~