First of all If persist() is called within transaction, the insert may happen immediately or it may be queued until the end of the transaction, depending on the flush mode. You can always force the insertion manually within a transaction by calling the flush( chapter 5 page 76 enterprise javabeans 3 o'reilly).
From your code: in public Request addRequest(..... ) method
Here you are calling sendToQueue(r.getId()); method while you are still in the transaction and the transaction will end after the addRequest(.... ) method returns. As because you are still in the transaction method the some entities might not be inserted immediately and the message driven bean will not able to find some entity. That is why you need to call manual flush method.
OR you could try by omitting the the line @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
from public Request addRequest(... ) method.
It seems redundant to use @TransactionAttribute in both methods addRequest(... ) and ddRequestUnit(....) . you should not use it in addRequest(.. ) method.
Your addRequestUnit(....) is fine and you are using @TransactionAttribute thats good.
Finally when we are dealing with concurrency i think it is a good idea to use flush method manually and we will be certain that the entity will persist.
These are all my understanding ... and sorry in advance if my guess is wrong..
Hope this info will help you