问题描述
我使用 Spring 4.2.5
和 org.hibernate 5.1.0
。
当我使用 entityManager.persist(user)
来保存用户
时,它可以'保存到数据库,没有错误抛出。
When I use entityManager.persist(user)
to save user
,it can't save to the database,and no error throw.
但如果我添加 entityManager.getTransaction()。begin();
和 entityManager.getTransaction()。commit();
它工作。
But if I add entityManager.getTransaction().begin();
and entityManager.getTransaction().commit();
it worked.
代码
@Service
@Transactional
public class UserTestService {
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
public void addUser(User user){
EntityManager entityManager = entityManagerFactory.createEntityManager();
//entityManager.getTransaction().begin();
entityManager.persist(user);
//entityManager.getTransaction().commit();
}
}
我的配置
@Configuration
@EnableTransactionManagement
public class JPAConfig {
@Autowired
private DataSource dataSource;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter() );
entityManagerFactoryBean.setPackagesToScan("zhihu.model");
return entityManagerFactoryBean;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.MYSQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
return adapter;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
}
我的模特
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private long userID;
@Column(name="username")
private String username;
@Column(name="password")
private String password;
public User(){
}
public User(long userID, String username, String password) {
this.userID = userID;
this.username = username;
this.password = password;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public long getUserID() {
return userID;
}
public void setUserID(long userID) {
this.userID = userID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.10.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
</dependencies>
我认为问题是交易
。但是下面的调试日志。
I think the problem is Transactional
.But the debug log below .
2016-05-05 21:33:10 DEBUG TransactionImpl:51 - begin
2016-05-05 21:33:10 DEBUG TransactionImpl:62 - committing
UPDATE
如果我添加 entityManager.flush();
导致 javax.persistence.TransactionRequiredException:没有正在进行的事务。
有什么问题?
if I add entityManager.flush();
caused javax.persistence.TransactionRequiredException: no transaction is in progress.
What is the problem?
推荐答案
解决方案是注入 EntityManager
而不是 EntityManagerFactory
The solution is to inject the EntityManager
instead of EntityManagerFactory
这篇关于entityManager.persist不保存任何内容到数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!