0

I have the next data model:

@Entity
@Table(name = Tables.USERS, catalog = Database.NAME)
public class User implements Serializable {

    private static final long serialVersionUID = -8190974017668449062L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = Tables.Users.ID, nullable = false)
    @Type(type="pg-uuid")
    private UUID mId;
    @Column(name = Tables.Users.FIRST_NAME, nullable = false)
    private String mFirstName;
    @Column(name = Tables.Users.LAST_NAME, nullable = false)
    private String mLastName;
    @Column(name = Tables.Users.EMAIL, nullable = false)
    private String mEmail;
    @Column(name = Tables.Users.BIRTHDATE, nullable = false)
    @Type(type="date")
    private Date mBirthdate;
    @Column(name = Tables.Users.SEX, nullable = false)
    @Enumerated(EnumType.STRING)
    private Sex mSex;
    @Column(name = Tables.Users.HASH, nullable = false, length = 32)
    private String mHash;
    @Column(name = Tables.Users.SALT, nullable = false, length = 20)
    private String mSalt;

    public UUID getId() {
        return mId;
    }

    public User setId(final UUID id) {
        mId = id;
        return this;
    }

    public String getFirstName() {
        return mFirstName;
    }

    public User setFirstName(final String firstName) {
        mFirstName = firstName;
        return this;
    }

    public String getLastName() {
        return mLastName;
    }

    public User setLastName(final String lastName) {
        mLastName = lastName;
        return this;
    }

    public String getEmail() {
        return mEmail;
    }

    public User setEmail(final String email) {
        mEmail = email;
        return this;
    }

    public Date getBirthdate() {
        return mBirthdate;
    }

    public User setBirthdate(Date birthdate) {
        mBirthdate = birthdate;
        return this;
    }

    public Sex getSex() {
        return mSex;
    }

    public User setSex(Sex sex) {
        mSex = sex;
        return this;
    }

    public String getHash() {
        return mHash;
    }

    public User setHash(String hash) {
        mHash = hash;
        return this;
    }

    public String getSalt() {
        return mSalt;
    }

    public User setSalt(String salt) {
        mSalt = salt;
        return this;
    }
}

My EntityManager is:

@Service
public class UserManager implements IUserManager {

    private static final int PAGE_SIZE = 10;

    @Autowired
    private UserDAO mDAO;

    @Override
    public List<User> getAllUsers() {
        return mDAO.getAllUsers();
    }

    @Override
    public List<User> getUsers(int pageNumber) {
        return mDAO.getUsers(pageNumber, PAGE_SIZE);
    }

    @Override
    public User getUserByEmail(String email) {
        return mDAO.getUserByEmail(email);
    }

    @Override
    public User getUserById(UUID id) {
        return mDAO.getUserById(id);
    }

    @Override
    public boolean hasEmail(String email) {
        return mDAO.getUserByEmail(email) != null;
    }

    @Override
    public boolean add(User user) {
        return mDAO.add(user);
    }
}

And my DAO:

@Repository
public class UserDAO implements IUserDAO {

    @PersistenceContext
    private EntityManager mEntityManager;

    @Override
    public List<User> getAllUsers() {
        CriteriaBuilder builder = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<User> cq = builder.createQuery(User.class);
        Root<User> root = cq.from(User.class);
        cq.select(root);
        TypedQuery<User> tq = mEntityManager.createQuery(cq);
        return tq.getResultList();
    }

    @Override
    public List<User> getUsers(int pageNumber, int pageSize) {

        try {
            CriteriaBuilder builder = mEntityManager.getCriteriaBuilder();
            CriteriaQuery<User> cq = builder.createQuery(User.class);
            Root<User> root = cq.from(User.class);
            cq.select(root);
            TypedQuery<User> tq = mEntityManager.createQuery(cq);
            tq.setMaxResults(pageSize);
            tq.setFirstResult((pageNumber - 1) * pageSize);
            return tq.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public User getUserByEmail(String email) {

        try {
            CriteriaBuilder builder = mEntityManager.getCriteriaBuilder();
            CriteriaQuery<User> cq = builder.createQuery(User.class);
            Root<User> root = cq.from(User.class);
            cq.where(builder.equal(root.get(Tables.Users.EMAIL), email));
            cq.select(root);
            TypedQuery<User> tq = mEntityManager.createQuery(cq);
            return tq.getSingleResult();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public User getUserById(UUID id) {
        CriteriaBuilder builder = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<User> cq = builder.createQuery(User.class);
        Root<User> root = cq.from(User.class);
        cq.where(builder.equal(root.get(Tables.Users.ID), id));
        cq.select(root);
        TypedQuery<User> tq = mEntityManager.createQuery(cq);
        return tq.getSingleResult();
    }

    @Override
    public boolean add(User user) {

        try {
            EntityTransaction transaction = mEntityManager.getTransaction();
            transaction.begin();
            mEntityManager.persist(user);
            transaction.commit();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }
}

When I'm trying to add a new user to the database in my controller:

@RequestMapping("users")
@RestController
public class UserController {

    @Autowired
    private UserManager mUserManager;

    @PostMapping(value = "new")
    public ResponseEntity<UserModel> register(@RequestBody NewUserModel newUser) {
        User user = UserUtils.toUser(mUserManager, newUser);
        user.setId(UUID.randomUUID());

        if (!mUserManager.add(user)) {
            throw new InternalServerException(ServerError.INTERNAL);
        }

        UserModel userModel = new UserModel(user);

        return new ResponseEntity<>(userModel, HttpStatus.OK);
    }
}

My UserManager returns false though User object is correct. But I have checked it in the debug mode, my manager didn't call even add() method from UserDAO, instead of it the control was moved to CglibAopProxy in the method intercept... It goes through this method body and after I am getting false return in UserManager... I got a nothing just...
Where can I find an error? I haven't ideas even.

Denis Sologub
  • 7,277
  • 11
  • 56
  • 123
  • 1
    Would appear that Spring is throwing an exception which should definitely be part of the stacktrace. I'd read through the logs. You didnt provide an mvce (https://stackoverflow.com/help/mcve) so I attempted to put one together based on what you did provide and I tried to fill in the gaps as best I could. When I run a test I get a IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead when executing the add method – Sean Carroll Dec 23 '17 at 04:04
  • @SeanCarroll Sorry, my English isn't so good... I didn't get how must I make a transaction then? – Denis Sologub Dec 23 '17 at 04:07
  • 1
    First, I'd verify that you're actually getting the same exception that I'm getting. If you are I'd suggest looking at https://stackoverflow.com/questions/17860696/not-allowed-to-create-transaction-on-shared-entitymanager-use-spring-transacti – Sean Carroll Dec 23 '17 at 04:09
  • @SeanCarroll Thank you very much, I'll check now.... In any case I know an error at least cuz my debugger didn't output any exception. – Denis Sologub Dec 23 '17 at 04:40
  • 1
    if you findings don't match mine I'd suggest providing more details around your configuration including datasource – Sean Carroll Dec 23 '17 at 04:51

0 Answers0