public MappedDrinkType createNewDrinkType(
            final String name, 
            final String description, 
            final double costPerML, 
            final int userId) 
    {
        final MappedDrinkType returnObj = new MappedDrinkType();
        try {
            insertLock.lock();
            
            final String query = Conca.t(
                    "insert into drink_type ",
                    "(name, created_by_userFk, descript, cost_per_ml) ",
                    "VALUES ",
                    "(?, ?, ?, ?)"
                    );
    
            final List<Object> values = new ArrayList<Object>();
            final List<Class<?>> types = new ArrayList<Class<?>>();
    
            values.add(name);
            types.add(String.class);
    
            values.add(userId);
            types.add(Integer.class);
    
            values.add(description);
            types.add(String.class);
    
            values.add(costPerML);
            types.add(Double.class);
    
    
            try {
                int rows = executeUpdate(query, values, types);
                final boolean success = (rows == 1);
    
                if (success) {
                    // get the last inserted id (this is connection specific)
                    // and this method is synchronized, so as long as nothing
                    // else inserts into this table (on this connection, without
                    // synchronizing), retrieving the last insert id this way 
                    // should not have any concurrency problems.
                    final String lastInserttedIdQuery = "select last_insert_id()";
                    final ResultSet rs = execute(lastInserttedIdQuery, Collections.emptyList(), new ArrayList<Class<?>>());
                    if (rs.next()) {
                        returnObj.setTypeId(rs.getInt(1));
                    }
    
                    returnObj.setName(name);
                    returnObj.setCreatedBy(findMappedUser(userId));
                    returnObj.setCostPerML(costPerML);
                    returnObj.setDescription(description);
                }
    
            } catch (Exception e) {
                log4jLogger.error(
                    Conca.t(
                        "error occurred while attempting to insert new drink type. ",
                        "userid [", userId, "] name [", name, "] costPerML [", costPerML, "] ",
                        " description [", description, "]"
                    ), 
                    e
                );
            }
        } finally {
            insertLock.unlock();
        }

        return returnObj;
    }