2017-01-31 5 views
1

Вот мой метод контроллера:Repository не сохраняет данные Н2 в памяти дб

// 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; 
} 

И мой репозиторий интерфейс: UserRepository

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); 

}

А вот мой Entity Пользователь (получатели и установщики опущен)

@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; 
} 

Когда я стреляю JSON в моем локальном хосте: 8080/регистрация:

{ 
"username":"ss", 
"password":"mkyong.com", 
"email":"[email protected]" 
} 

Я получаю ответ Отличная работа! поэтому он отлично работает. Но когда я проверяю свою БД на localhost: 8080/console, у нее просто есть тестовая таблица, и новый пользователь не добавляется.

У меня есть мой спящий режим настройки DDL в application.properties установлено:

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

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

Итак, как я могу обновить свой код, который он создает таблицы пользователей и сохранить созданный пользователем в эту БД? Я собираюсь изменить свой db позже, просто используя H2, чтобы проверить, работают ли мои контроллеры нормально, но это не имеет значения.

EDIT: Вот мой RepositoryConfiguration.java:

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

EDIT2: Когда я хочу, чтобы зарегистрировать один и тот же пользователь снова (используя тот же JSON), то это дает мне "Пользователь уже существует" resposne так что это уже в дБ ... Почему я не могу это увидеть? Может, у меня есть H2 где-то еще? Не в базовом/консольном или другом порту? Как я могу это проверить?

ответ

0

Я думаю, что вам не хватает транзакционной части вашего сервиса. Вы определили менеджера транзакций в своем весеннем контексте?

Если это так, вам необходимо добавить аннотацию @Transactional в ваш сервис. Например:

@Service 
public class UserServiceBean { 

    @Transactional 
    public User saveUser(User user) { 
     return userRepository.save(user); 
    } 
} 
+0

Менеджер транзакций не настроен автоматически, когда я использую Spring Boot с интерфейсом CrudRepository? Когда я добавил Transactional, как вы упомянули, он еще не заполнил H2 db. – doublemc

+0

Можете ли вы изменить свой вопрос, чтобы обеспечить конфигурацию пружины, пожалуйста? –

+0

Добавлено, это пустой класс с просто аннотациями - читайте где-то достаточно. – doublemc

0

мне пришлось добавить:

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

к application.properties и теперь он прекрасно работает. Я просто подумал, что мне это не нужно, потому что Spring будет автоматически настраивать его для меня, но, видимо, этого не происходит.

+0

Если это весенняя загрузка 1.5+, то достаточно только URL-адреса – rajadilipkolli

Смежные вопросы