The problem was caused by a combination of hibernate property name and the value that was set.
If you implement your own entity factory, hibernate properties are set to a default settings that doesn't seem to match hibernate's user guide such as the problem I am facing and it seems to be the only one.
Since I am using @EnableAutoConfiguration(exclude = {HibernateJpaAutoConfiguration.class }), the application.properties for hibernate setup doesn't apply anymore. Below is not necessary since by default via auto configuration, it is snake case. Solution below is also mentioned by many people to get it to work with snake case.
spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicityNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
Noticed that "hibernate.naming.physical-strategy" is the property name to set but that is not the case when you set it within your property class, you have to set your hibernate property to 'hibernate.physical-strategy'
Another problem is the property value. I went from hibernate's doc..
Implicit: default, jpa, org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
Physical: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
to this..
Implicit: org.springframework.boot.orm.jpa.hibernate.SpringImplicityNamingStrategy
Physical: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
I have a feeling that hibernate's implementation is probably different than jpa's. It doesn't matter what value i set using hibernate's, it does not work. Setting the SpringPhysicalNamingStrategy fixed the problem. SpringImplicityNamingStrategy doesn't do anything as well.
Another issue I am having is that lazy loading doesn't behave the same but hibernate.enable_lazy_load_no_trans is an anti-pattern workaround.