JPA вернул объект, выбрасывающий внутреннюю ошибку сервера

0

Я создаю API, используя базу данных JAX-RS и MySql (JPA). У меня есть следующий метод, который проверяет имя пользователя и пароль и создает токен для сеанса:

public Customer validateCustomer(Customer customer) {

    //get the customer from the database
    Query q = em.createQuery("SELECT c from Customer c WHERE c.login = :username");
    q.setParameter("username", customer.getLogin());
    List<Customer> results = q.getResultList();

    //check if user exsists
    if(!results.isEmpty()){
       Customer fromDb = results.get(0);

       //check if user provided correct password
       if (!fromDb.getPassword().equals(customer.getPassword())) {
           return null;
       } else {
           //create the session token and save it to the database
           Random random = new SecureRandom();
           String token = new BigInteger(130, random).toString(32);
           tx.begin();
           int executeUpdate = em.createQuery("UPDATE Customer c SET c.token = :token WHERE c.id = :id")
                   .setParameter("token", token)
                   .setParameter("id", fromDb.getId())
                   .executeUpdate();
           tx.commit();
           em.close();

           //update previously pulled customer with the token
           fromDb.setToken(token);

           //return the customer
           return fromDb;
       }
    } else {
        return null;
    }
}

Этот метод вызывается и потребляется:

public Response login (Customer customer){
    Customer c = customerService.validateCustomer(customer);
    if (c != null){
        return Response.status(Response.Status.OK).entity(c).build();
        //System.out.println(c);
    } else {
        return Response.status(Response.Status.FORBIDDEN).entity("Incorrect username or password.").build();
    }
}

Моя проблема в том, что всякий раз, когда предоставляется правильный логин, и я возвращаю свой

return fromDb;

Я получаю внутреннюю ошибку сервера 500 в моем браузере:

HTTP ERROR 500

Проблема с доступом /api/users/login. Причина:

Внутренняя ошибка сервера

Работает на Jetty://

Однако ошибка возникает только тогда, когда я возвращаю оригинальный клиент из базы данных. Если я создаю новый объект Customer из того же объекта, который был возвращен из базы данных, и вернул его, он работает нормально.

Customer c = new Customer();
           c.setEmail(fromDb.getEmail());
           c.setLogin(fromDb.getLogin());
           c.setToken(token);
           c.setId(fromDb.getId());

Возвращение c вместо fromDb отлично работает.

Есть ли причина, по которой объект из базы данных может возвращать разные результаты, чем построенный из нее объект?

Журнал сервера при возврате из DB (получение ошибки):

 INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)  
 INFO: HHH000115: Hibernate connection pool size: 20  
 INFO: HHH000006: Autocommit mode: true  
 INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]  
 INFO: HHH000046: Connection properties: {user=root, autocommit=true, release_mode=auto}  
 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect  
 INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory  
 INFO: HHH000397: Using ASTQueryTranslatorFactory  
 INFO: HHH000228: Running hbm2ddl schema update  
 INFO: HHH000102: Fetching database metadata  
 INFO: HHH000396: Updating schema  
 INFO: HHH000261: Table found: test.account  
 INFO: HHH000037: Columns: [balance, name, id, accnumber, sortcode]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer  
 INFO: HHH000037: Columns: [password, city, street, county, name, id, login, email, token]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer_account  
 INFO: HHH000037: Columns: [account_id, customer_id]  
 INFO: HHH000108: Foreign keys: [fk70eacecc22b4f18d, fk70eacecc3a281067]  
 INFO: HHH000126: Indexes: [fk70eacecc22b4f18d, fk70eacecc3a281067, account_id]  
 INFO: HHH000261: Table found: test.hibernate_sequences  
 INFO: HHH000037: Columns: [sequence_next_hi_value, sequence_name]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: []  
 INFO: HHH000232: Schema update complete  
 WARN: HHH000436: Entity manager factory name (Bank) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'  
 INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)  
 INFO: HHH000115: Hibernate connection pool size: 20  
 INFO: HHH000006: Autocommit mode: true  
 INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]  
 INFO: HHH000046: Connection properties: {user=root, autocommit=true, release_mode=auto}  
 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect  
 INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory  
 INFO: HHH000397: Using ASTQueryTranslatorFactory  
 INFO: HHH000228: Running hbm2ddl schema update  
 INFO: HHH000102: Fetching database metadata  
 INFO: HHH000396: Updating schema  
 INFO: HHH000261: Table found: test.account  
 INFO: HHH000037: Columns: [balance, name, id, accnumber, sortcode]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer  
 INFO: HHH000037: Columns: [password, city, street, county, name, id, login, email, token]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer_account  
 INFO: HHH000037: Columns: [account_id, customer_id]  
 INFO: HHH000108: Foreign keys: [fk70eacecc22b4f18d, fk70eacecc3a281067]  
 INFO: HHH000126: Indexes: [fk70eacecc22b4f18d, fk70eacecc3a281067, account_id]  
 INFO: HHH000261: Table found: test.hibernate_sequences  
 INFO: HHH000037: Columns: [sequence_next_hi_value, sequence_name]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: []  
 INFO: HHH000232: Schema update complete  
 WARN: HHH000436: Entity manager factory name (Bank) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'  
 com.mycompany.bank.model.Customer@769f10ad  
 Returning: com.mycompany.bank.model.Customer@e501b7e  

Журнал ошибок при возврате c (без ошибок)

 INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)  
 INFO: HHH000115: Hibernate connection pool size: 20  
 INFO: HHH000006: Autocommit mode: true  
 INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]  
 INFO: HHH000046: Connection properties: {user=root, autocommit=true, release_mode=auto}  
 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect  
 INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory  
 INFO: HHH000397: Using ASTQueryTranslatorFactory  
 INFO: HHH000228: Running hbm2ddl schema update  
 INFO: HHH000102: Fetching database metadata  
 INFO: HHH000396: Updating schema  
 INFO: HHH000261: Table found: test.account  
 INFO: HHH000037: Columns: [balance, name, id, accnumber, sortcode]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer  
 INFO: HHH000037: Columns: [password, city, street, county, name, id, login, email, token]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer_account  
 INFO: HHH000037: Columns: [account_id, customer_id]  
 INFO: HHH000108: Foreign keys: [fk70eacecc22b4f18d, fk70eacecc3a281067]  
 INFO: HHH000126: Indexes: [fk70eacecc22b4f18d, fk70eacecc3a281067, account_id]  
 INFO: HHH000261: Table found: test.hibernate_sequences  
 INFO: HHH000037: Columns: [sequence_next_hi_value, sequence_name]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: []  
 INFO: HHH000232: Schema update complete  
 WARN: HHH000436: Entity manager factory name (Bank) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'  
 INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)  
 INFO: HHH000115: Hibernate connection pool size: 20  
 INFO: HHH000006: Autocommit mode: true  
 INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]  
 INFO: HHH000046: Connection properties: {user=root, autocommit=true, release_mode=auto}  
 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect  
 INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory  
 INFO: HHH000397: Using ASTQueryTranslatorFactory  
 INFO: HHH000228: Running hbm2ddl schema update  
 INFO: HHH000102: Fetching database metadata  
 INFO: HHH000396: Updating schema  
 INFO: HHH000261: Table found: test.account  
 INFO: HHH000037: Columns: [balance, name, id, accnumber, sortcode]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer  
 INFO: HHH000037: Columns: [password, city, street, county, name, id, login, email, token]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer_account  
 INFO: HHH000037: Columns: [account_id, customer_id]  
 INFO: HHH000108: Foreign keys: [fk70eacecc22b4f18d, fk70eacecc3a281067]  
 INFO: HHH000126: Indexes: [fk70eacecc22b4f18d, fk70eacecc3a281067, account_id]  
 INFO: HHH000261: Table found: test.hibernate_sequences  
 INFO: HHH000037: Columns: [sequence_next_hi_value, sequence_name]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: []  
 INFO: HHH000232: Schema update complete  
 WARN: HHH000436: Entity manager factory name (Bank) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'  
 com.mycompany.bank.model.Customer@455917ff  
 Returning: com.mycompany.bank.model.Customer@302ab24b  
 INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)  
 INFO: HHH000115: Hibernate connection pool size: 20  
 INFO: HHH000006: Autocommit mode: true  
 INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]  
 INFO: HHH000046: Connection properties: {user=root, autocommit=true, release_mode=auto}  
 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect  
 INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory  
 INFO: HHH000397: Using ASTQueryTranslatorFactory  
 INFO: HHH000228: Running hbm2ddl schema update  
 INFO: HHH000102: Fetching database metadata  
 INFO: HHH000396: Updating schema  
 INFO: HHH000261: Table found: test.account  
 INFO: HHH000037: Columns: [balance, name, id, accnumber, sortcode]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer  
 INFO: HHH000037: Columns: [password, city, street, county, name, id, login, email, token]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer_account  
 INFO: HHH000037: Columns: [account_id, customer_id]  
 INFO: HHH000108: Foreign keys: [fk70eacecc22b4f18d, fk70eacecc3a281067]  
 INFO: HHH000126: Indexes: [fk70eacecc22b4f18d, fk70eacecc3a281067, account_id]  
 INFO: HHH000261: Table found: test.hibernate_sequences  
 INFO: HHH000037: Columns: [sequence_next_hi_value, sequence_name]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: []  
 INFO: HHH000232: Schema update complete  
 WARN: HHH000436: Entity manager factory name (Bank) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'  
 INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)  
 INFO: HHH000115: Hibernate connection pool size: 20  
 INFO: HHH000006: Autocommit mode: true  
 INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]  
 INFO: HHH000046: Connection properties: {user=root, autocommit=true, release_mode=auto}  
 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect  
 INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory  
 INFO: HHH000397: Using ASTQueryTranslatorFactory  
 INFO: HHH000228: Running hbm2ddl schema update  
 INFO: HHH000102: Fetching database metadata  
 INFO: HHH000396: Updating schema  
 INFO: HHH000261: Table found: test.account  
 INFO: HHH000037: Columns: [balance, name, id, accnumber, sortcode]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer  
 INFO: HHH000037: Columns: [password, city, street, county, name, id, login, email, token]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: [primary]  
 INFO: HHH000261: Table found: test.customer_account  
 INFO: HHH000037: Columns: [account_id, customer_id]  
 INFO: HHH000108: Foreign keys: [fk70eacecc22b4f18d, fk70eacecc3a281067]  
 INFO: HHH000126: Indexes: [fk70eacecc22b4f18d, fk70eacecc3a281067, account_id]  
 INFO: HHH000261: Table found: test.hibernate_sequences  
 INFO: HHH000037: Columns: [sequence_next_hi_value, sequence_name]  
 INFO: HHH000108: Foreign keys: []  
 INFO: HHH000126: Indexes: []  
 INFO: HHH000232: Schema update complete  
 WARN: HHH000436: Entity manager factory name (Bank) is already registered.  If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'  
Теги:
jpa
jax-rs

1 ответ

0

Прежде всего, ваш запрос не подходит: вы не можете использовать псевдонимы во время обновления. Попробуйте em.createQuery("UPDATE Customer SET token = :token WHERE id = :id")

  • 0
    Я исправил свой запрос, но он не повлиял на результаты. Тем не менее, спасибо за ваш отзыв, я всегда рад узнать что-то от более опытных пользователей. Это мой первый проект с использованием JPA (проект колледжа).
  • 0
    Пожалуйста, попробуйте найти журналы приложений, чтобы проверить, в чем ошибка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню