DSolve[] is returning an implicit form of the solution, that is, an unsolved equation that implicitly defines r[t] in terms of t.
You say the ODE is "easily solved by setting r==1/u." If I do that, I get an equally complicated solution with InverseFunction[] instead of an unsolved equation. Whether the solution is expressed as
$F(r(t))=g(t)$ or
$r(t)=F^{-1}(g(t))$ does not make much difference to me; they are both inconvenient. The equation form is probably easier to deal with. Here's a way to plot an example solution:
impl = DSolve[r''[t] + m/r[t]^2 == h, r[t], t];
example = First[impl] /. (* plug in values for constants *)
{C[1] -> 0, C[2] -> 0, m -> 1, h -> 1};
ContourPlot[example
, {t, 0, 12}, {r[t], 0, 100}
, WorkingPrecision -> 16, FrameLabel -> Automatic]
(WorkingPrecision prevents gaps in the plot due to round-off errors in the imaginary parts of the computation of the curve. They should cancel out, but floating-point round-off errors sometimes result in nonzero imaginary parts.)