我有一个Spring Boot Application + JPA with MySQL。在我的控制器中,当我发布一个实体时,我可以调用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;
}
答案 0 :(得分:8)
在我的(有限的)体验中,由于Spring在幕后发生了神奇的事情,这些类型的问题有点难以调试,但我会尝试提供一些帮助我解决类似问题的建议 - 希望这样为您提供所需的轻推。
@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
这里会有很多输出,但你会很好地了解幕后发生的事情。
第三,我学习如何使用flush
时最重要的部分是每次调用DAO都会创建一个新会话 - 或者 - 如果在同一事务范围内,则重用现有会话。有关此示例,请参阅上面的文档。
现在,我怀疑当您回读更新的对象时,您的交易仍被视为已打开。尝试在save方法中执行<div class="pages section">
<div class="container">
<div class="pages-head">
<h3>PORTFOLIO</h3>
<div class="underline"></div>
<h7> BRIDAL MAKEUP </h7>
</div>
<div class="portfolio">
<ul class="simplefilter">
<li class="active" data-filter="1"><p>BRIDAL 1</p></li>
<li data-filter="2"><p>BRIDAL 2</p></li>
<li data-filter="3"><p>BRIDAL 3</p></li>
<li data-filter="4"><p>BRIDAL 4</p></li>
</ul>
<div class="row">
<div class="filtr-container">
<!-- bridal gallery 1 photos -->
<div class="col s6 filtr-item col-pd" data-category="1">
<a href="../img/portfolio/bridal/gallery_1/bridal_gallery_1-1.jpg" class="image-popup"><img class="responsive-img" src="../img/portfolio/bridal/gallery_1/bridal_gallery_1-1.jpg" alt="sample image"></a>
</div>
<div class="col s6 filtr-item col-pd" data-category="1">
<a href="../img/portfolio/bridal/gallery_1/bridal_gallery_1-2.jpg" class="image-popup"><img class="responsive-img" src="../img/portfolio/bridal/gallery_1/bridal_gallery_1-2.jpg" alt="sample image"></a>
</div>
<div class="col s6 filtr-item col-pd" data-category="1">
<a href="../img/portfolio/bridal/gallery_1/bridal_gallery_1-3.jpg" class="image-popup"><img class="responsive-img" src="../img/portfolio/bridal/gallery_1/bridal_gallery_1-3.jpg" alt="sample image"></a>
</div>
<div class="col s6 filtr-item col-pd" data-category="1">
<a href="../img/portfolio/bridal/gallery_1/bridal_gallery_1-4.jpg" class="image-popup"><img class="responsive-img" src="../img/portfolio/bridal/gallery_1/bridal_gallery_1-4.jpg" alt="sample image"></a>
</div>
<!-- end bridal gallery 1 photos -->
</div>
</div>
</div>
</div>
</div>
<!-- end portfolio single -->
,看看是否有助于将更改保留在数据库中。
希望你能够在不使用上述资源的情况下找到问题,如果没有,你至少应该有一些更完整的信息来解决为什么持久性不会持续存在。
答案 1 :(得分:3)
我终于找到了解决方案...我试图更新的实体上有@Immutable注释......
答案 2 :(得分:1)
我认为您的问题在于您使用注释@UserCanCud进行拦截。
我刚刚使用你提出的相同设置制作了一个项目并且它正常工作。看看:
https://github.com/nitzap/spring-data-mysql
如果我遗失了什么,请告诉我。
答案 3 :(得分:-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