This is completely expected. You set the parent of the child, but didn't add the child to the parent list. And all is in a single transaction, so the parent returned by the second call to em.find(parentKey)
comes directly from the first-level cache and is thus the exact same object as the one returned by the first call.
It's your responsibility to maintain the coherence of the object graph in a transaction. See http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/#tutorial-associations-usingbidir