entityManager.bestehen nichts sparen zur Datenbank
Benutze ich Spring 4.2.5
und org.hibernate 5.1.0
.
Wenn ich entityManager.persist(user)
zu speichern user
ist ,kann es nicht in der Datenbank speichern,und keine Fehler werfen.
Aber wenn ich auf add entityManager.getTransaction().begin();
und entityManager.getTransaction().commit();
es funktionierte.
code unten
@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();
}
}
Und meine config
@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();
}
}
Und mein Modell
@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>
Ich denke, das problem ist Transactional
.Aber das debug-log unten .
2016-05-05 21:33:10 DEBUG TransactionImpl:51 - begin
2016-05-05 21:33:10 DEBUG TransactionImpl:62 - committing
UPDATE
wenn ich entityManager.flush();
verursacht javax.persistence.TransactionRequiredException: no transaction is in progress.
Was ist das problem?
- Keine
TransactionRequiredException
geschluckt irgendwo? - Sie haben zu begin transaction. Sagen entityManager.getTransaction().begin(). Entweder EntityTransaction die commit-Methode oder der entityManager.flush(); nicht beide. Wenn Sie sagen, commit() der Transaktion wird geschlossen, und Sie können nicht sagen, dass flush() wieder. So wählen Sie mit bedacht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die Lösung zu injizieren, die
EntityManager
stattEntityManagerFactory
Begehen, wird die Datenbank-commit. Die änderungen an persistenten Objekten werden in der Datenbank geschrieben.
Wenn Sie ein persistentes Objekt und ändern Sie den Wert auf, wird es schmutzig und hibernate muss bündig diese änderungen der Persistenz-Schicht. Es kann dies automatisch für Sie erledigen oder Sie müssen dies manuell tun, das hängt von Ihrem flush-Modus(auto oder manuell) 🙂
schließlich, die Sie verwenden sollten commit : Transaktion.commit() ist Spülen Sie die Sitzung, sondern es endet auch die Einheit der Arbeit.
Überprüfen hier für mehr .
entityManager.flush();
verursachtjavax.persistence.TransactionRequiredException: no transaction is in progress
.Was ist das problem?Wenn Sie
Geändert wird, spiegeln nicht in Datenbank nach dieser Anweisung ausgeführt wird.
Entität verwaltet flush diese änderungen der Persistenz-Schicht automatisch.
Wir haben die Möglichkeit, zu Spülen, es manuell mit
Dies sollte Ihr problem lösen
entityManager.flush();
verursacht javax.die Persistenz.TransactionRequiredException: keine Transaktion ausgeführt wird.Was ist das problem?