Load JPA repository queries from a property file - java

I need to load queries in a repository from a property file. For example, here:
#Repository
public interface StudentRepository extends JpaRepository<Student, Integer> {
#Query(value="SELECT * FROM student where year= :le", native=true)
public List<Student> getStudentsByLevel(#Param("le") int level);
}
I need to load the "SELECT * FROM student where year= :le" string from a property file. Is there any way to do it?

As suggested above I have overcome this problem by using xml configured named queries. Below is the example.
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="hibernatePersistenceUnit">
<!-- <mapping-file>META-INF/jpql/oracle-quries.xml</mapping-file> -->
<mapping-file>META-INF/jpql/mysql-quries.xml</mapping-file>
</persistence-unit>
</persistence>
mysql-quries.xml
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd ">
<named-native-query name="Nodecontrol.lockNodeController">
<query>
SELECT * FROM student where year= :le
</query>
</named-native-query>
</entity-mappings>
In oracle-quries.xml and mysql-quries.xml I have defined all the native queries respectively. When I need to change the query without changing the class file I just need to mention the file name i need to use in persistence.xml.

Related

setPackagesToScan on EntityManagerFactory when Persistence.createEntityManagerFactory(

With the following code, the EntityManagerFactory's metamodel has no packages/classes.
I'm missing the parallel sessionFactory.setPackagesToScan() in LocalSessionFactoryBean.
EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, hibernateReactiveProperties());
Metamodel metamodel = emf.getMetamodel();
Mutiny.SessionFactory reactiveSessionFactory = emf.unwrap(Mutiny.SessionFactory.class);
solved by adding class tag for each entity in persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="default" >
<provider>org.hibernate.reactive.provider.ReactivePersistenceProvider</provider>
<class>com.company.EntityClassName</class>
</persistence-unit>
</persistence>

Does persistence.xml support *.xml?

If mine persistence.xml file like this:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="jpa">
<mapping-file>jpaOrm/*.xml</mapping-file>
</persistence-unit>
</persistence>
Can spring-data-jpa load all the XML-terminated files in the jpaOrm folder?
I don't think so, but I guess you tried and already found out that it doesn't work? The reason is that the mapping files are looked up by using ClassLoader#getResource() where the mapping file path is passed in. It does that because the class path is not scannable by default i.e. you can ask for elements on the class path that match a pattern. It can be done of course, but that would hurt performance as class path scanning is one of the most expensive operations.

EclipseLink silently ignores mapping-file from persinstence.xml

I've tried to declare converter in my orm.xml file:
orm-pg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_2_1.xsd"
version="2.1">
<converter class="com.example.PgUuidConverter" auto-apply="true"/>
</entity-mappings>
persistence.xml :
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="jpa" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=postgres-ds)</jta-data-source>
<mapping-file>META-INF/orm-pg.xml</mapping-file>
</persistence-unit>
</persistence>
Because the converter was not registered, I've added for debug another mapping-file:
<mapping-file>META-INF/orm-pg2.xml</mapping-file>
This file doesn't exist. To my surprise, the persistence unit has started without even the slightest warning in logs.
Now I'm confused because I have no idea if my converter was not registered because the orm.xml is wrong or because it was simply not loaded.
How can I debug if the mapping-file was loaded succesfully or not? Why the missing files that are referenced are ignored?
I'm deploying in Karaf Container using Aries JPA 2.5.0

Hibernate tools: persistence unit not found

I have created a Hibernate / JPA project and I'd like to create entities from tables.
While the tool works like a charm selecting a pure Hibernate configuration, in the JPA mode it does not work, claiming the absence of the persistence unit
As shown in the following photo, the persistence unit is located in the folder /src/main/resources/META-INF
This is the code of persistence.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="socialsports" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc/LiveDataSource</jta-data-source>
</persistence-unit>
</persistence>
This is the result of my attempt to run Hibernate tools to generate entities:
Since it only doesn't work in JPA mode, the use of the deprecated org.hibernate.ejb.HibernatePersistenceProvider could be a problem. Try org.hibernate.jpa.HibernatePersistenceProvider instead.

JPA persistence.xml adding classes

I have a question regarding the class integration in the persistence xml.
Is something like this possible?
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="ranea">
<class>com.dal.pojo.*</class>
</persistence-unit>
</persistence>
I know that this does not work....but I have a rather big database structure and I would appreciate an answere how to include my pojo classes in the persistence unit easily.
If you're using Eclipse, you can right click on persistence and use "synchronize class list".

Categories