Lazy collection returns uninitialized proxy despite having full entity in 2nd-level cache

Like I told you in Hibernate.initialize() does not initialize lazy @Basic fields, it’s probably better to use a DTO mapping for this instead.

I see though that your mapping is unnecessarily complex. You do see that initializing the collection causes a join to the target table? So you don’t gain anything from making the attributes in Language lazy.
I don’t understand why you are making name and code lazy, but I would suggest you to not do that. If you care about caching the collection, you can annotate the collection with the @Cache annotation. Also see the documentation