There is an idle_in_transaction_session_timeout parameter to kill connections that are idle (in transaction) for too long. It was implemented specifically for cases like this.
Thanks for reminding me of this. I'll probably look to set it but make sure to point out that it is just a safety net to let DB maintenance run and they should make sure their work is committed cleanly if they want to keep it.