This commit is contained in:
helori_ollivier
2025-12-17 17:14:08 +01:00
parent 46e1272cc6
commit 47e61cf8b2
14 changed files with 434 additions and 12 deletions

43
pom.xml
View File

@@ -13,5 +13,48 @@
<maven.compiler.target>25</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JPA API -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.2.0</version>
</dependency>
<!-- Implementation JPA (Hibernate) -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>7.1.11.Final</version>
</dependency>
<!-- Base de donnees PostgreSQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.8</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,17 +1,33 @@
package bzh.risotto;
//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
static void main() {
//TIP Press <shortcut actionId="ShowIntentionActions"/> with your caret at the highlighted text
// to see how IntelliJ IDEA suggests fixing it.
IO.println(String.format("Hello and welcome!"));
import bzh.risotto.dto.ClientDTO;
import bzh.risotto.service.ClientService;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import java.util.Date;
for (int i = 1; i <= 5; i++) {
//TIP Press <shortcut actionId="Debug"/> to start debugging your code. We have set one <icon src="AllIcons.Debugger.Db_set_breakpoint"/> breakpoint
// for you, but you can always add more by pressing <shortcut actionId="ToggleLineBreakpoint"/>.
IO.println("i = " + i);
}
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("banquePU");
EntityManager em = emf.createEntityManager();
ClientService clientService = new ClientService(em);
// Exemple de creation d'un client
ClientDTO clientDTO = new ClientDTO();
clientDTO.setNumClient(1);
clientDTO.setNomClient("Dupont");
clientDTO.setPrenomClient("Jean");
clientDTO.setAdClient("123 Rue de Paris");
clientDTO.setDateNaissClient(new Date());
clientDTO.setAgeClient(30);
//clientDTO.setNumAgent(1);
ClientDTO createdClient = clientService.createClient(clientDTO);
System.out.println("Client cree: " + createdClient.getNomClient());
em.close();
emf.close();
}
}

View File

@@ -0,0 +1,72 @@
package bzh.risotto.dao;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
import java.util.List;
import java.util.Optional;
public abstract class AbstractDAO<T, K> implements DAO<T, K> {
private final Class<T> entityClass;
protected EntityManager entityManager;
public AbstractDAO(Class<T> entityClass, EntityManager entityManager) {
this.entityClass = entityClass;
this.entityManager = entityManager;
}
@Override
public Optional<T> find(K id) {
return Optional.ofNullable(entityManager.find(entityClass, id));
}
@Override
public List<T> findAll() {
return entityManager.createQuery("SELECT e FROM " + entityClass.getSimpleName() + " e", entityClass)
.getResultList();
}
@Override
public void save(T entity) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.persist(entity);
transaction.commit();
} catch (Exception e) {
if (transaction != null && transaction.isActive()) {
transaction.rollback();
}
throw e;
}
}
@Override
public void update(T entity) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.merge(entity);
transaction.commit();
} catch (Exception e) {
if (transaction != null && transaction.isActive()) {
transaction.rollback();
}
throw e;
}
}
@Override
public void delete(T entity) {
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
transaction.commit();
} catch (Exception e) {
if (transaction != null && transaction.isActive()) {
transaction.rollback();
}
throw e;
}
}
}

View File

@@ -0,0 +1,19 @@
package bzh.risotto.dao;
import bzh.risotto.model.Client;
import jakarta.persistence.EntityManager;
import java.util.List;
public class ClientDAO extends AbstractDAO<Client, Integer> {
public ClientDAO(EntityManager entityManager) {
super(Client.class, entityManager);
}
public List<Client> findByAgent(int numAgent) {
return entityManager.createQuery(
"SELECT c FROM Client c WHERE c.agent.numAgent = :numAgent", Client.class)
.setParameter("numAgent", numAgent)
.getResultList();
}
}

View File

@@ -0,0 +1,12 @@
package bzh.risotto.dao;
import java.util.List;
import java.util.Optional;
public interface DAO<T, K> {
Optional<T> find(K id);
List<T> findAll();
void save(T entity);
void update(T entity);
void delete(T entity);
}

View File

@@ -0,0 +1,18 @@
package bzh.risotto.dto;
import lombok.Data;
import java.util.Date;
@Data
public class ClientDTO {
private int numClient;
private String nomClient;
private String prenomClient;
private String adClient;
private Date dateNaissClient;
private int ageClient;
private int numAgent;
// Constructeurs, getters et setters
}

View File

@@ -0,0 +1,30 @@
package bzh.risotto.mapper;
import bzh.risotto.dto.ClientDTO;
import bzh.risotto.model.Client;
public class ClientMapper {
public static ClientDTO toDTO(Client client) {
ClientDTO dto = new ClientDTO();
dto.setNumClient(client.getNumClient());
dto.setNomClient(client.getNomClient());
dto.setPrenomClient(client.getPrenomClient());
dto.setAdClient(client.getAdClient());
dto.setDateNaissClient(client.getDateNaissClient());
dto.setAgeClient(client.getAgeClient());
dto.setNumAgent(client.getAgent() != null ? client.getAgent().getNumAgent() : 0);
return dto;
}
public static Client toEntity(ClientDTO dto) {
Client client = new Client();
client.setNumClient(dto.getNumClient());
client.setNomClient(dto.getNomClient());
client.setPrenomClient(dto.getPrenomClient());
client.setAdClient(dto.getAdClient());
client.setDateNaissClient(dto.getDateNaissClient());
client.setAgeClient(dto.getAgeClient());
// Note: La relation avec Agent doit etre geree separement
return client;
}
}

View File

@@ -0,0 +1,21 @@
package bzh.risotto.model;
import jakarta.persistence.*;
import lombok.Data;
@Entity
@Data
@Table(name = "Agence")
public class Agence {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "numAgence")
private int numAgence;
@Column(name = "telAgence")
private String telAgence;
@Column(name = "adAgence")
private String adAgence;
}

View File

@@ -0,0 +1,27 @@
package bzh.risotto.model;
import jakarta.persistence.*;
import lombok.Data;
@Entity
@Data
@Table(name = "Agent")
public class Agent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "numAgent")
private int numAgent;
@Column(name = "nomAgent")
private String nomAgent;
@Column(name = "prenomAgent")
private String prenomAgent;
@Column(name = "salaire")
private double salaire;
@Column(name = "estDirecteur")
private boolean estDirecteur;
}

View File

@@ -0,0 +1,46 @@
package bzh.risotto.model;
import jakarta.persistence.*;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Entity
@Data
@Table(name = "Client")
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "numClient")
private int numClient;
@Column(name = "nomClient", nullable = false)
private String nomClient;
@Column(name = "prenomClient", nullable = false)
private String prenomClient;
@Column(name = "adClient")
private String adClient;
@Column(name = "dateNaissClient")
@Temporal(TemporalType.DATE)
private Date dateNaissClient;
@Column(name = "ageClient")
private int ageClient;
@ManyToOne
@JoinColumn(name = "numAgent", referencedColumnName = "numAgent")
private Agent agent;
@ManyToMany
@JoinTable(
name = "Compte_Client",
joinColumns = @JoinColumn(name = "numClient"),
inverseJoinColumns = @JoinColumn(name = "numCompte")
)
private List<Compte> comptes;
// Constructeurs, getters et setters
}

View File

@@ -0,0 +1,26 @@
package bzh.risotto.model;
import jakarta.persistence.*;
import java.util.List;
@Entity
@Table(name = "Compte")
public class Compte {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "numCompte")
private int numCompte;
@Column(name = "solde")
private double solde;
@Column(name = "typeCompte", nullable = false)
private String typeCompte;
@OneToMany(mappedBy = "compte", cascade = CascadeType.ALL)
private List<Operation> operations;
@ManyToMany(mappedBy = "comptes")
private List<Client> clients;
// Constructeurs, getters et setters
}

View File

@@ -0,0 +1,31 @@
package bzh.risotto.model;
import jakarta.persistence.*;
import lombok.Data;
import java.sql.Date;
import java.util.List;
@Entity
@Data
@Table(name = "Operation")
public class Operation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "numOperation")
private int numOperation;
@Column(name = "dateOperation")
private Date dateOperation;
@Column(name = "typeOperation")
private String typeOperation;
@Column(name = "montant")
private double montant;
@OneToOne()
@JoinColumn(name = "numCompte", referencedColumnName = "numCompte")
private Compte compte;
}

View File

@@ -0,0 +1,41 @@
package bzh.risotto.service;
import bzh.risotto.dao.ClientDAO;
import bzh.risotto.dto.ClientDTO;
import bzh.risotto.mapper.ClientMapper;
import bzh.risotto.model.Client;
import jakarta.persistence.EntityManager;
import java.util.List;
import java.util.stream.Collectors;
public class ClientService {
private final ClientDAO clientDAO;
public ClientService(EntityManager entityManager) {
this.clientDAO = new ClientDAO(entityManager);
}
public ClientDTO createClient(ClientDTO clientDTO) {
Client client = ClientMapper.toEntity(clientDTO);
clientDAO.save(client);
return ClientMapper.toDTO(client);
}
public ClientDTO getClient(int id) {
return clientDAO.find(id)
.map(ClientMapper::toDTO)
.orElseThrow(() -> new RuntimeException("Client not found"));
}
public List<ClientDTO> getAllClients() {
return clientDAO.findAll().stream()
.map(ClientMapper::toDTO)
.collect(Collectors.toList());
}
public List<ClientDTO> getClientsByAgent(int numAgent) {
return clientDAO.findByAgent(numAgent).stream()
.map(ClientMapper::toDTO)
.collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,20 @@
<persistence version="3.1" xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_1.xsd">
<persistence-unit name="banquePU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>bzh.risotto.model.Client</class>
<class>bzh.risotto.model.Compte</class>
<class>bzh.risotto.model.Operation</class>
<class>bzh.risotto.model.Agent</class>
<class>bzh.risotto.model.Agence</class>
<properties>
<property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/banque_db"/>
<property name="jakarta.persistence.jdbc.user" value="user"/>
<property name="jakarta.persistence.jdbc.password" value="password"/>
<property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>