Spring Boot Hibernate加载但不保存来自事件监听器的数据

时间:2017-03-30 08:00:56

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

从事件侦听器内部保存数据时遇到问题。

目前我正在侦听AuthenticationSuccessEvent,并且正在按预期调用事件(使用记录器进行检查)。

我希望能够在事件中使用JPA存储库,并在触发事件时保存数据。

正在初始化存储库,仅从数据库加载数据,而userRepository.save()不起作用。在保存期间我也没有任何例外。 save()方法在其他RestController中工作没有任何问题。

(使用的数据库是MySQL)

这是实现ApplicationListener接口的侦听器类:

@Component
@Transactional
public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

@Autowired
private UserRepository userRepository;

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Override
public void onApplicationEvent(AuthenticationSuccessEvent event) {
    logger.info(userRepository.toString());
    String username = event.getAuthentication().getName();
    LoggedUser loggedUser = (LoggedUser) event.getAuthentication().getPrincipal();
    logger.info("Logged user: " + loggedUser);

    if (userRepository.existsByUsername(event.getAuthentication().getName())) {
        logger.info("Existing user: " + event.getAuthentication().getName());
        User user = userRepository.findByUsername(username);
        user.setFirstname(loggedUser.getFirstName());
        user.setLastname(loggedUser.getLastName());
        logger.info("Saved: " + userRepository.save(user).toString());
    } else {
        logger.info("Not existing user: " + event.getAuthentication().getName());
        User user = new User(loggedUser.getFirstName(), loggedUser.getLastName(), "", username);
        logger.info(user.toString());
        logger.info("Saved: " + userRepository.save(user).toString());
    }
  }
}

UserRepository.java:

@Repository
public interface UserRepository extends JpaRepository<User, Long>{

  List<User> findAll();

  List<User> findByFirstname(String firstname);
  List<User> findByLastname(String lastname);
  List<User> findByFirstnameAndLastnameAndEmail(String firstname, String lastname, String email);

  User findByEmail(String email);   
  User findByUsername(String username);

  @Query("SELECT CASE WHEN COUNT(u) > 0 THEN true ELSE false END FROM User u WHERE u.email = :email")
  boolean existsByEmail(@Param("email") String email);


  @Query("SELECT CASE WHEN COUNT(u) > 0 THEN true ELSE false END FROM User u WHERE u.username = :username")
  boolean existsByUsername(@Param("username") String username);

}

编辑1(在保存点附近添加日志):

10:58:52.351 [http-nio-8080-exec-4] DEBUG o.s.j.d.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/airpng]
10:58:52.404 [http-nio-8080-exec-4] DEBUG org.hibernate.loader.Loader - Result set row: 0
10:58:52.405 [http-nio-8080-exec-4] DEBUG org.hibernate.loader.Loader - Result row: 
10:58:52.978 [http-nio-8080-exec-4] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager
10:58:52.979 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Initiating transaction commit
10:58:52.979 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Committing Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])]
10:58:52.980 [http-nio-8080-exec-4] DEBUG o.h.e.t.internal.TransactionImpl - committing
10:58:52.982 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Closing Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])] after transaction
10:59:03.767 [http-nio-8080-exec-4] INFO  a.p.a.shared.AuthenticationListener - Not existing user: bob
10:59:05.754 [http-nio-8080-exec-4] INFO  a.p.a.shared.AuthenticationListener -  Firstname: Bob | Lastname: Hamilton | E-Mail: 
10:59:07.172 [http-nio-8080-exec-4] DEBUG o.s.d.r.c.s.TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource - Adding transactional method 'save' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
10:59:12.915 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
10:59:12.916 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Opened new Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])] for Hibernate transaction
10:59:12.916 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Preparing JDBC Connection of Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])]
10:59:12.916 [http-nio-8080-exec-4] DEBUG o.s.j.d.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/airpng]
10:59:12.932 [http-nio-8080-exec-4] DEBUG o.h.e.t.internal.TransactionImpl - begin
10:59:12.933 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Exposing Hibernate transaction as JDBC transaction [com.mysql.jdbc.JDBC4Connection@38ba8070]
10:59:17.963 [http-nio-8080-exec-4] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Opening JPA EntityManager
10:59:17.964 [http-nio-8080-exec-4] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Registering transaction synchronization for JPA EntityManager
10:59:26.892 [http-nio-8080-exec-4] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager
10:59:26.898 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Initiating transaction commit
10:59:26.898 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Committing Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])]
10:59:26.899 [http-nio-8080-exec-4] DEBUG o.h.e.t.internal.TransactionImpl - committing
10:59:26.900 [http-nio-8080-exec-4] DEBUG o.s.o.h.HibernateTransactionManager - Closing Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=0} updates=ExecutableList{size=0} deletions=ExecutableList{size=0} orphanRemovals=ExecutableList{size=0} collectionCreations=ExecutableList{size=0} collectionRemovals=ExecutableList{size=0} collectionUpdates=ExecutableList{size=0} collectionQueuedOps=ExecutableList{size=0} unresolvedInsertDependencies=null])] after transaction

编辑2(添加了用户实体):

@Entity
@Table(name = "user")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USER_ID")

private long userId;
@NotNull
@Size(min = 1, max = 50)
@Column(name = "USER_FIRSTNAME")
private String firstname;

@NotNull
@Size(min = 1, max = 50)
@Column(name = "USER_LASTNAME")
private String lastname;

@NotNull
@Size(min = 1, max = 150)
@Column(name = "USER_USERNAME")
private String username;

@NotNull
@Size(min = 0, max = 150)
@Column(name = "USER_EMAIL")
private String email;

@Column(name = "USER_ACTIVE", nullable = false)
private boolean active;

@Autowired
@OneToMany(mappedBy = "user")
@JsonBackReference
private List<Ownership> ownerships;

public User() {
}

public User(long userId) {
    this.userId = userId;
}

public User(String firstname, String lastname, String email, String username) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.email = email;
    this.username = username;
    this.active = true;
}

public User(String firstname, String lastname, String email) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.email = email;
    this.active = true;
}



public long getId() {
    return userId;
}

public void setId(long Id) {
    this.userId = Id;
}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public boolean isActive() {
    return active;
}

public void setActive(boolean active) {
    this.active = active;
}

public List<Ownership> getOwnerships() {
    return ownerships;
}

public void setOwnerships(List<Ownership> ownerships) {
    this.ownerships = ownerships;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

@Override
public String toString() {
    return " Firstname: " + firstname + " | Lastname: " + lastname + " | E-Mail: " + email;
}

}

0 个答案:

没有答案