Skip to content
Snippets Groups Projects
Commit 0c36f232 authored by Emmanuel Bruno's avatar Emmanuel Bruno
Browse files

cleans and improves JPA.

parent 8ef2b732
Branches feature/minor-updates
No related tags found
No related merge requests found
Showing
with 111 additions and 54 deletions
# Project fr.univtln.bruno.samples/jee9.1 # Project fr.univtln.bruno.samples/jee9.1
Steps to run this project: ## Steps to run this project
1. COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose up --build -d 1. COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose up --build -d
2. Visit 2. Visit
1. curl http://localhost:8080/jee9.1/resources/sample 1. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample
2. curl http://localhost:8080/jee9.1/resources/sample/hello 2. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/hello
3. curl http://localhost:8080/jee9.1/resources/sample/dao1 3. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/main
4. curl http://localhost:8080/jee9.1/resources/sample/dao2 4. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons
5. curl -H "Content-Type: application/json" \
-X POST \
-d '{"name":"Jeanne"}' \
http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons
6. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons/843c8236-6c6b-450e-9aa3-211a9b897403
7. curl -H "Accept: text/xml" http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons
## Import "real" certificate
openssl x509 -outform der -in localhost.pem -out localhost.der openssl x509 -outform der -in localhost.pem -out localhost.der
keytool -import -noprompt -trustcacerts -storepass storepass -alias localhost -keystore mycert-pub.jks -file localhost.der keytool -import -noprompt -trustcacerts -storepass storepass -alias localhost -keystore mycert-pub.jks -file localhost.der
......
...@@ -7,7 +7,7 @@ import jakarta.persistence.PersistenceUnit; ...@@ -7,7 +7,7 @@ import jakarta.persistence.PersistenceUnit;
import java.util.Map; import java.util.Map;
public class DAO1 { public class MainDAO {
@PersistenceUnit(unitName="myappPU") @PersistenceUnit(unitName="myappPU")
EntityManagerFactory entityManagerFactory; EntityManagerFactory entityManagerFactory;
......
package fr.univtln.bruno.samples.jee91.dao;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
long id;
private String name;
}
package fr.univtln.bruno.samples.jee91.dao; package fr.univtln.bruno.samples.jee91.dao;
import fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers.H2Database;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import java.util.List; import java.util.List;
import java.util.UUID;
public class DAO2 { public class PersonDAO {
private EntityManager entityManager; private EntityManager entityManager;
@Inject @Inject
public DAO2(@H2Database EntityManager entityManager) { public PersonDAO(@H2Database EntityManager entityManager) {
this.entityManager = entityManager; this.entityManager = entityManager;
} }
...@@ -17,4 +19,13 @@ public class DAO2 { ...@@ -17,4 +19,13 @@ public class DAO2 {
return entityManager.createNamedQuery("Person.findAll").getResultList(); return entityManager.createNamedQuery("Person.findAll").getResultList();
} }
public UUID persist(Person person) {
entityManager.persist(person);
return person.getUuid();
}
public Person findByUUID(UUID uuid) {
return entityManager.createNamedQuery("Person.findByUUID", Person.class).setParameter("uuid",uuid).getSingleResult();
}
} }
package fr.univtln.bruno.samples.jee91.dao; package fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers;
import jakarta.enterprise.inject.Produces; import jakarta.enterprise.inject.Produces;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
......
package fr.univtln.bruno.samples.jee91.dao; package fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers;
import jakarta.inject.Qualifier; import jakarta.inject.Qualifier;
......
package fr.univtln.bruno.samples.jee91.dao; package fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers;
import jakarta.inject.Qualifier; import jakarta.inject.Qualifier;
......
...@@ -15,6 +15,10 @@ ...@@ -15,6 +15,10 @@
<groupId>jakarta.platform</groupId> <groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId> <artifactId>jakarta.jakartaee-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
package fr.univtln.bruno.samples.jee91.dao; package fr.univtln.bruno.samples.jee91.dao;
import jakarta.json.bind.annotation.JsonbTransient;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.FieldDefaults;
import java.util.UUID;
@Table(name = "PERSON")
@Entity @Entity
@Getter
@Setter
@NamedQueries({ @NamedQueries({
@NamedQuery(name = "Person.findAll", @NamedQuery(name = "Person.findAll",
query = "select p from Person p"), query = "select p from Person p"),
@NamedQuery( @NamedQuery(
name = "Person.findAllOrderedByName", name = "Person.findAllOrderedByName",
query = "SELECT p FROM Person p ORDER BY p.name") query = "SELECT p FROM Person p ORDER BY p.name"),
@NamedQuery(
name = "Person.findByUUID",
query = "SELECT p FROM Person p WHERE p.uuid=:uuid")
}) })
@XmlRootElement @XmlRootElement
@FieldDefaults(level = AccessLevel.PRIVATE)
public class Person { public class Person {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@JsonbTransient
long id; long id;
private String name; @Column(name = "NAME")
String name;
@Column(name = "UUID", updatable = false, nullable = false, unique = true)
UUID uuid = UUID.randomUUID();
} }
package fr.univtln.bruno.samples.jee91.rs; package fr.univtln.bruno.samples.jee91.rs;
import fr.univtln.bruno.samples.jee91.dao.DAO1; import fr.univtln.bruno.samples.jee91.dao.MainDAO;
import fr.univtln.bruno.samples.jee91.dao.DAO2;
import fr.univtln.bruno.samples.jee91.dao.Person; import fr.univtln.bruno.samples.jee91.dao.Person;
import fr.univtln.bruno.samples.jee91.dao.PersonDAO;
import fr.univtln.bruno.samples.jee91.ejb.Hello; import fr.univtln.bruno.samples.jee91.ejb.Hello;
import fr.univtln.bruno.samples.jee91.ejb.qualifiers.SpokenLanguage; import fr.univtln.bruno.samples.jee91.ejb.qualifiers.SpokenLanguage;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.GET; import jakarta.transaction.Transactional;
import jakarta.ws.rs.Path; import jakarta.ws.rs.*;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.config.inject.ConfigProperty;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID;
@Path("sample") @Path("sample")
//@Stateless
@Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_XML})
public class SampleResource { public class SampleResource {
@Inject @Inject
...@@ -25,10 +27,10 @@ public class SampleResource { ...@@ -25,10 +27,10 @@ public class SampleResource {
Hello hello; Hello hello;
@Inject @Inject
DAO1 dao1; MainDAO mainDAO;
@Inject @Inject
DAO2 dao2; PersonDAO personDAO;
@Inject @Inject
@ConfigProperty(name = "message") @ConfigProperty(name = "message")
...@@ -46,16 +48,29 @@ public class SampleResource { ...@@ -46,16 +48,29 @@ public class SampleResource {
} }
@GET @GET
@Path("dao1") @Path("main")
@Produces(MediaType.APPLICATION_JSON) public Map<String, Object> mainGetMetadata() {
public Map<String, Object> dao1() { return mainDAO.getMetadata();
return dao1.getMetadata();
} }
@GET @GET
@Path("dao2") @Path("persons")
@Produces(MediaType.APPLICATION_JSON) public List<Person> personsFindAll() {
public List<Person> dao2() { return personDAO.findAll();
return dao2.findAll();
} }
@GET
@Path("persons/{uuid}")
public Person personsFind(@PathParam("uuid") UUID uuid) {
return personDAO.findByUUID(uuid);
}
@Transactional
@POST
@Path("persons")
@Consumes(MediaType.APPLICATION_JSON)
public UUID personsPersist(Person person) {
return personDAO.persist(person);
}
} }
INSERT INTO "public"."person" ("name") VALUES ('pierre'); INSERT INTO "public"."person" ("name", "uuid") VALUES ('Yves', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870B25A000916801FE374FCFAC5DCF94C11');
INSERT INTO "public"."person" ("name") VALUES ('Marie'); INSERT INTO "public"."person" ("name", "uuid") VALUES ('Pierre', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870B8F28F7D3945291756DAC7325DF44938');
INSERT INTO "public"."person" ("name") VALUES ('jacques'); INSERT INTO "public"."person" ("name", "uuid") VALUES ('Marie', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F73745369674269747378709AA3211A9B897403843C82366C6B450E');
INSERT INTO "public"."person" ("name") VALUES ('Annie'); INSERT INTO "public"."person" ("name", "uuid") VALUES ('Jeanne', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870BC1580AEB48C0F0C0B3C82E884AA4C3C');
\ No newline at end of file \ No newline at end of file
package fr.univtln.bruno.samples.jee91.ws; package fr.univtln.bruno.samples.jee91.ws;
import fr.univtln.bruno.samples.jee91.dao.DAO1; import fr.univtln.bruno.samples.jee91.dao.MainDAO;
import fr.univtln.bruno.samples.jee91.ejb.Hello; import fr.univtln.bruno.samples.jee91.ejb.Hello;
import fr.univtln.bruno.samples.jee91.ejb.qualifiers.SpokenLanguage; import fr.univtln.bruno.samples.jee91.ejb.qualifiers.SpokenLanguage;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
...@@ -25,7 +25,7 @@ public class WSServer { ...@@ -25,7 +25,7 @@ public class WSServer {
Hello hello; Hello hello;
@Inject @Inject
DAO1 dao1; MainDAO dao1;
@OnOpen @OnOpen
public void onOpen(Session session) throws EncodeException, IOException { public void onOpen(Session session) throws EncodeException, IOException {
......
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
bean-discovery-mode="all">
</beans>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment