Dortmund's Mario Goetze opened the scoring for the visitors when he superbly drilled in through the legs of defender Andreas Beck and past keeper Koen Casteels in the 26th minute.
Hoffenheim's Sven Schipplock, however, levelled nine minutes later, stabbing the ball in from close range.
Dortmund, who had lost ground in the title race following two draws and a defeat in their last three league matches, renewed their lead early in the second half with Kevin Grosskreutz rounding off a quick move started by Goetze.
The goal took any will to fight out of the hosts and Poland striker Robert Lewandowski rounded Casteels to score his 10th league goal in the 66th minute.
"It was important to go into the break with the three points," Dortmund defender Mats Hummels said.
"We have wasted eight or 10 points so far this season and that is frustrating. We have to improve in the second half of the season to reach our goals," said the Germany international.
Dortmund, who host Hanover 96 in the German Cup round of 16 on Wednesday, move up to third on 30 points, 12 behind leaders Bayern Munich and three behind second-placed Bayer Leverkusen, who beat Hamburg 3-0 on Saturday.
Hoffenheim's sixth straight league defeat left them in the relegation playoff spot, seven points behind 15th placed Wolfsburg.
"My players gave it all they had and I cannot blame anyone," said Hoffenheim interim coach Frank Kramer. "We will now discuss everything else calmly during the winter break."
Leaders Bayern drew 1-1 against Borussia Moenchengladbach on Friday to go into the break with a nine-point cushion over Leverkusen.
- Sports & Recreation