It looks like Android has finally decided to be strict about battery optimizations and hence it is difficult to bypass doze mode. The whole point is that you really shouldn't be doing any work on a device that has been stationary for hours and rather wait until a maintenance window (where jobs will start) or the user picks up their device.
For doing inexact or periodic work which, please explore JobScheduler: that's literally what it is built for and offers you good variety in terms of scheduling [based on criteria like periodicity, metered/ unmetered network, charging etc].
They don't want us to do any work at all while dozing. So from what I can think of, your use-case of "once every hour" is only on best promise from now on. Schedule and 'hope'. Having said that, Android N has a more 'practical' (lenient) version of the doze mode where maintenance windows are quicker. You could test, my feeling is that it's not as gloomy as it sounds. The policy is fair: if a user shows the intent of interacting with the phone, they would trigger jobs.
ref
https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/