【问题标题】:Repository doesn't save data to H2 in-memory db存储库不将数据保存到 H2 内存数据库
【发布时间】:2017-06-16 17:33:33
【问题描述】:

这是我的控制器方法:

// CREATE A USER
@PostMapping("/register")
public String createUser(
        @RequestBody User user
) {
    if (userService.userExists(user)) {
        return "User already exists";
    }

    userService.saveUser(user);
    return "Good job!";
}

UserServiceBean

@Service
public class UserServiceBean {


private UserRepository userRepository;

@Autowired
public UserServiceBean(UserRepository userRepository) {
    this.userRepository = userRepository;
}

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

public boolean userExists(User user) {
    if (userRepository.findByUsername(user.getUsername()) == null) {
        return false;
    }
    return true;
}

还有我的接口存储库: 用户存储库

public interface UserRepository extends CrudRepository<User, Long> {

// TODO: 29.01.17 Create a query to find all todos for logged in user

@Query("select td from User u inner join u.toDoItems td where u = :user")
public Iterable<ToDoItem> findAllToDosForLoggedInUser(@Param("user") User user);

public User findByUsername(String username);

}

这是我的用户实体(省略了 getter 和 setter)

@Entity
@Table (name = "USERS")
public class User extends BaseEntity {

@Column(name = "USERNAME")
private String username;

// TODO: 28.01.17 Find a way to store hashed and salted pws in DB
@Column(name = "PASSWORD")
private String password;

@Column(name = "EMAIL")
private String email;

// user can have many ToDoItems
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private Set<ToDoItem> toDoItems;

// JPA demands empty constructor
public User() {}

public User(String username, String password, String email) {
    this.username = username;
    this.password = password;
    this.email = email;
}

当我在我的 localhost:8080/register 上拍摄 JSON 时:

{
"username":"ss",
"password":"mkyong.com",
"email":"asdasd@wp.pl"
}

我得到了回复干得好!所以它工作正常。但是当我在 localhost:8080/console 检查我的数据库时,它只有测试表并且没有添加新用户。

我在 application.properties 中设置了休眠 ddl:

# Console to H2 database to check data
spring.h2.console.enabled=true
spring.h2.console.path=/console

spring.jpa.hibernate.ddl-auto=create-drop

那么,如何更新创建表 USERS 的代码并将创建的用户保存到该数据库中?稍后我将更改我的数据库,仅使用 H2 来检查我的控制器是否工作正常,但在这里应该没关系。

编辑: 这是我的 RepositoryConfiguration.java

@Configuration
@EnableAutoConfiguration
@EntityScan(basePackages = {"com.doublemc.domain"})
@EnableJpaRepositories(basePackages = {"com.doublemc.repositories"})
@EnableTransactionManagement
public class RepositoryConfiguration {
}

编辑2: 当我想再次注册同一个用户(使用相同的 JSON)时,它给了我“用户已经存在”的响应,所以它已经在数据库中......为什么我看不到它呢?也许我在其他地方有H2?不在基本的 /console 或不同的端口?我该如何检查?

【问题讨论】:

    标签: java hibernate spring-boot spring-data-jpa h2


    【解决方案1】:

    我认为您缺少服务的交易部分。您是否在 spring 上下文中定义了事务管理器?

    如果是这样,您需要将注解@Transactional 添加到您的服务中。例如:

    @Service
    public class UserServiceBean {
    
        @Transactional
        public User saveUser(User user) {
            return userRepository.save(user);
        }
    }
    

    【讨论】:

    • 当我使用带有 CrudRepository 接口的 Spring Boot 时,事务管理器没有自动配置?当我按照你提到的添加 Transactional 时,它仍然没有填充 H2 db。
    • 您可以编辑您的问题以提供您的弹簧配置吗?
    • 已添加,它是一个只有注释的空类 - 在某处阅读就足够了。
    【解决方案2】:

    我必须补充:

    spring.datasource.url=jdbc:h2:~/test
    spring.datasource.driver-class-name=org.h2.Driver
    

    到 application.properties,它现在工作得很好。我只是认为我不需要它,因为 Spring 会为我自动配置它,但显然它不需要。

    【讨论】:

    • 如果是spring-boot 1.5+ 那么只有URL就够了
    猜你喜欢
    • 2012-03-24
    • 2012-10-06
    • 2020-02-15
    • 2011-08-11
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2019-07-03
    相关资源
    最近更新 更多