If you ask around your local CS faculty, you'll find that most computer scientists think that C++ deserves to burn in the deepest darkest corner of hell. But their opinion of java isn't a lot better.
C++ is a horribly complex language. Almost no one knows the entire thing, and different features of the language are known to break each other. Seeing as you say you know C++ I'm sure that you have already bumped into some of its problems.
That said, a good well designed program will work out well on either platform. C++ lets you write faster more efficient code, but unless you know you need to do that, all you'll end up doing is building a horrible unmaintainable mess.
Java implements a much purer form of OOP than c++ which means that your designs have a little less room for error (although again, I've gotten into some pretty nasty snafus with java)
So point by point:
1a) Games
You definitely want c++ here. Game programming is one of the rare exceptions where you need all the performance you can get. Unless your game has very little in terms of graphics, you will want c++.
1b) Productivity
Java. You don't need c++. Garbage collection in java means that you won't have memory leaks bringing down your business systems. While both languages have been proven in the real world, i see no reason to start a new application in c++. Back in the dark ages, the Java VM was a little crappy and you got sluggy performance, but this has been for the most part all fixed.
2) Databases
Either one is fine, there are hundreds of libraries for any database imaginable here, and there aren't massive differences. However some of the big heavy commercial databases (oracle for example) use java internally, so you can write java that runs directly in the database engine which might give it a small lead.
3)
Java wins hands down. C++ will leave you wanting to stab people in the face. While Java generics can be a little mind bending they are nowhere near the sheer trauma that C++ will do to you.
4)
Garbage Collection. There's no reason why you should be doing it yourself in a modern language. There are lots of C++ libraries that will do it for you, but that should ring warning bells about why you are using c++ in the first place.
A real OOP language has no use for pointers. C++ will make you use them.
A good OOP language shouldn't need to bloat the size of your program every time you use generics
I'm sure I came off a little biased, but in my opinion 99 times out of 100, if you are using c++, you should be using java. Not that java is without its problems, but thats a different question.