Oh man, I didn't know there was a JDE thread here. I fucking hate that piece of shit software.
I used to do development on what they call Business Services in Oracle speech, which is basically a way to hook JDE into a Java app server. Natively, JDE only understands C code, so they give you an API you can use to call Java classes deployed on a remote app server, and a Java API to interface with JDE itself (database operations and calling C functions basically).
The whole point of this is to give JDE a way to interface with SOAP-based web services, or to expose internal JDE data to a public-facing service. Now, that's all fine and dandy, but it leads to a huge number of WTFs, starting by fucking WebLogic which is of course the only supported app server.
The biggest one I can think of, and the one that stuck into my mind as a novice programmer, relates to how they manage database interaction in these Java applets. If you go by how they teach you this stuff, you end up believing they automagically manage database transactions by calling the relevant Java API hooks they surface. But no -- they begin a transaction when you initialize the class and commit the changes when the class is destroyed.
This creates number of issues that aren't immediately obvious.
If any of your database operations within the Java applets fails (say, a unique key constraint violation), the whole transaction gets rolled back, by default. Worst of it all, you can call JDE C functions within the Java class, and if ANY of their database operations fails (which doesn't usually mean that the whole thing needs to die immediately), the Java applet receives an exception and the whole thing gets rolled back, no questions asked, no fucks given about the integrity of the operations put into motion by calling JDE functions, which means absolutely zero logging of your behavior (since usual way to log activity in JDE is basically database records).
This also means that you can't insert or update a record in this applet and then expect the results to be there when you're done -- by default, that's not possible.
Fortunately, they DO provide ways to initiate a separate DB transaction. It's almost as a footnote in their 800 page dev doc, and the way to do it doesn't even document the actual use cases for it, but it's there. It took me whereabouts of 3 days to actually understand the issue. I probably didn't do myself any favors, being a junior developer in general, but still...
Fuck JDE.