2015-09-06 82 views
2

我使用JpaRepository保存數據,但hibernate.show_sql顯示「select」並且不會保存數據。以下是我的服務:JpaRepository不會保存數據

@Autowired 
private UserRepository userRepository; 

@PostConstruct 
public void init() { 
    User admin = new User(); 
    admin.setDisplayName("admin"); 
    admin.setEmailAddress("[email protected]"); 
    admin.setPassword("admin___"); 
    admin.setRegisteredAt(new Date()); 
    admin.setLastAccessAt(new Date()); 
    admin.setUuid(UUID.randomUUID().toString()); 

    try { 
     System.out.println("before save"); 
     userRepository.save(admin); 
     System.out.println("after save"); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 

輸出看起來是這樣的:

========之前保存======

休眠:選擇user0_.uuid爲uuid1_0_0_ ,user0_.display_name作爲display_2_0_0_,user0_.email_address作爲email_ad3_0_0_,user0_last_access_at作爲last_acc4_0_0_,user0_.password作爲password5_0_0_,user0_.registered_at作爲register6_0_0_來自用戶user0_,其中user0_.uuid =?

========保存後=======

以下是我的applicationContext.xml:

<context:component-scan base-package="test"> 
    <context:exclude-filter type="annotation" 
     expression="org.springframework.stereotype.Controller" /> 
</context:component-scan> 

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/helloworld" /> 
    <property name="username" value="root" /> 
    <property name="password" value="password" /> 
</bean> 

<bean id="myEmf" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="packagesToScan" value="test.entity"></property> 
    <property name="dataSource" ref="myDataSource" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
    <property name="persistenceProvider"> 
     <bean class="org.hibernate.jpa.HibernatePersistenceProvider"></bean> 
    </property> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="myDataSource" /> 
</bean> 

<jpa:repositories base-package="test.repository" 
    entity-manager-factory-ref="myEmf" transaction-manager-ref="transactionManager"></jpa:repositories> 

附件是由JPA產生我的課工具:

@Entity 
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private String uuid; 

    @Column(name="display_name") 
    private String displayName; 

    @Column(name="email_address") 
    private String emailAddress; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name="last_access_at") 
    private Date lastAccessAt; 

    private String password; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name="registered_at") 
    private Date registeredAt; 

    public User() { 
    } 

    public String getUuid() { 
     return this.uuid; 
    } 

    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 

    public String getDisplayName() { 
     return this.displayName; 
    } 

    public void setDisplayName(String displayName) { 
     this.displayName = displayName; 
    } 

    public String getEmailAddress() { 
     return this.emailAddress; 
    } 

    public void setEmailAddress(String emailAddress) { 
     this.emailAddress = emailAddress; 
    } 

    public Date getLastAccessAt() { 
     return this.lastAccessAt; 
    } 

    public void setLastAccessAt(Date lastAccessAt) { 
     this.lastAccessAt = lastAccessAt; 
    } 

    public String getPassword() { 
     return this.password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public Date getRegisteredAt() { 
     return this.registeredAt; 
    } 

    public void setRegisteredAt(Date registeredAt) { 
     this.registeredAt = registeredAt; 
    } 

} 
+0

你確定你正在執行你發佈的代碼嗎?爲什麼要保存新用戶發出選擇查詢?另外,由於您使用的是JPA,事務管理器應該是JpaTransactionManager。 –

+0

你太棒了!在更改爲JpaTransactionManager後,它現在就像一個魅力。 –

+0

它首先顯示選擇,然後插入。這是正常的嗎? ========之前保存====== 休眠:選擇user0_.uuid爲uuid1_0_0_,user0_.display_name爲display_2_0_0_,user0_.email_address爲email_ad3_0_0_,user0_.last_access_at爲last_acc4_0_0_,user0_.password作爲password5_0_0_,user0_.registered_at作爲來自用戶user0_的register6_0_0_,其中user0_.uuid =? Hibernate:插入到用戶(display_name,email_address,last_access_at,password,registered_at,uuid)值(?,?,?,?,?,?) ========保存後====== = –

回答

2

由於您使用的是JPA,事務管理器應該是JpaTransactionManager而不是DataSourceTransactionManager

+0

這是正確的答案。更改爲org.springframework.orm.jpa.JpaTransactionManager後,我的應用程序可以正常工作。 –