2017-05-14 72 views
5

我有一個Spring引導應用程序+ JPA與MySQL。在我的控制器中,當我發佈實體時,我可以調用repository.save,並返回「創建/更新」對象。Spring存儲庫+ JPA + Hibernate沒有提交當repository.save

但是,當我看着數據庫,我看到該對象不更新。

這裏是我的application.yml:

spring: 
    jpa: 
    show-sql: true 
    generate-ddl: false 
    hibernate: 
     ddl-auto: none 
    properties: 
     hibernate.dialect: org.hibernate.dialect.MySQLDialect 
     org.hibernate.envers.store_data_at_delete: true 
     org.hibernate.envers.global_with_modified_flag: true 
     org.hibernate.envers.track_entities_changed_in_revision: true 
    datasource: 
    initialize: false 
    url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:databaseName}?createDatabaseIfNotExist=true 
    username: ${DB_USERNAME:root} 
    password: ${DB_PASSWORD:root} 
    driver-class-name: com.mysql.jdbc.Driver 
    hikari: 
     minimumIdle: 20 
     maximumPoolSize: 30 
     idleTimeout: 5000 
     data-source-properties: 
     cachePrepStmts: true 
     prepStmtCacheSize: 250 
     prepStmtCacheSqlLimit: 2048 

你知道還有什麼我有什麼關係?

這是我的控制器:

@RequestMapping(method = RequestMethod.POST, produces = "application/json") 
public MyEntity saveMyEntity(@Valid @RequestBody final MyEntity myEntity) { 
    Assert.notNull(myEntity, "The entry cannot be null"); 
    return myEntityService.save(myEntity); 
} 

而且MyEntityService:

@Override 
@UserCanCud 
public Entity save(final Entity entity) { 
    Assert.notNull(entity); 
    final Entity savedEntity = repository.save(entity); 
    return savedEntity; 
} 
+1

添加它調用控制器方法保存 –

+0

已編輯。我希望這是明確的 – Manuelarte

+0

您的交易邊界在哪裏? –

回答

2

我終於找到了解決辦法...我試圖更新了它的@Immutable註釋實體...

4

在我的(有限的)遇到這些類型的問題是一點點比較難,因爲神奇的發生背後的調試與春天的場景,但我會嘗試給一些建議,幫助我解決類似的問題 - 希望這可以讓你微調你需要的。

@Transactional表示法建立一個交易範圍,指示事務何時開始和結束,也稱爲邊界。如果您在此範圍之外進行操作,您將收到錯誤或事情無法按預期工作。

首先,我發現這個位文件對Spring的事務中最有幫助的:http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html專門this section

其次,您可能希望啓用跟蹤級別日誌和潛在的SQL語句,以幫助調試此。爲了做到這一點,我添加下面我application.properties - 您可以在同一添加到您的application.yml有一些小的調整

spring.jpa.properties.hibernate.show_sql=false 
spring.jpa.properties.hibernate.use_sql_comments=true 
spring.jpa.properties.hibernate.format_sql=true 
spring.jpa.properties.hibernate.type=trace 
spring.jpa.show-sql=true 
logging.level.org.hibernate=TRACE 

會有這裏輸出了很多,但你會得到一個好的想法在幕後發生了什麼。

第三,也是我學習如何使用@Transactional最重要的部分是,每次調用DAO都會創建一個新的會話 - 或者 - 如果在相同的事務範圍內重用現有會話。有關這方面的示例,請參閱上述文檔。

現在,我懷疑您的交易仍然被認爲是開放的,當你讀回更新的對象。嘗試在保存方法中執行flush並查看是否有助於將更改保留回數據庫。

希望你將能夠找到問題,而無需使用上述資源太多狩獵,如果不是你應該至少是具有周圍爲什麼餘輝不堅持一些更全面的信息。

+0

嗨羅伯特, 感謝您的評論,我已經嘗試過您的評論之前更加詳細看引擎蓋下發生了什麼,但仍然無法完成工作。 只是另一個評論,當實體被創建(id爲空),然後,交易完成...我可以看到插入語句,但我不能當我嘗試更新實體。 – Manuelarte

+0

如果使用'repository.find()'搜索實體並更新返回的實體,會發生什麼? –

+0

嗨,羅伯特,我試着你說的,做到這一點,repository.findOne(myEntity.getId),然後myEntity.setOneField(newValue); repository.save()並且仍然沒有保存它.... – Manuelarte

1

我覺得你的問題是,你與註解@UserCanCud做攔截。

我剛纔跟你提出了相同的設置項目,它工作正常。看一看:

https://github.com/nitzap/spring-data-mysql

如果我失去了一些東西,只是讓我知道。

+0

喜德, 嗯,奇怪的,因爲我試圖通過刪除註釋,也方面,仍然沒有更新。 – Manuelarte

+0

你可以嘗試我發給你的例子。我們可以確定問題在您的項目之外。 – German

-1

爲了保存你的對象,你需要設置適當的jpa配置和存儲庫後,它將被保存。

例如我們有用戶實體和userRepository如下

User Enity Class

package com.sanjeev.domain; 

import javax.persistence.*; 

@Entity(name = "user") 
@Table(name = "user") 
public class User { 

    @Id 
    @Column(name = "id") 
    private Long id; 
    @Column(nullable = false) 
    private String username; 
    @Column(nullable = false) 
    private String email; 
    @Column(nullable = false) 
    private String password; 

//getters and setters 
} 

User Repository class

package com.sanjeev.repository;  
    import com.sanjeev.domain.User; 
    import org.springframework.data.jpa.repository.JpaRepository; 

    public interface UserRepository extends JpaRepository<User, Long> { 

    } 

User Service class

package com.sanjeev.service; 

import org.springframework.stereotype.Service; 
import org.springframework.beans.factory.annotation.Autowired; 
import com.sanjeev.repository.UserRepository; 
import com.sanjeev.domain.User; 

@Service 
public class UserService{ 

    @Autowired 
    private UserRepository userRepository; 

    public void saveUser(User user){ 
    userRepository.save(user); 
    } 


} 

If you will follow above steps then your object must me saved

更多click here

+0

嗨sanjeevha,我不認爲我做錯了。我遵循上述步驟,仍然無法正常工作。 – Manuelarte

+0

其實我最近在我的機器上做了它,它的工作完美,如果你遵循給定的鏈接,那麼它可能是可能的,你會得到更多的想法 – sanjeevjha

相關問題