diff --git a/pom.xml b/pom.xml index 9528eca..8bff737 100644 --- a/pom.xml +++ b/pom.xml @@ -13,5 +13,48 @@ 25 UTF-8 + + + + jakarta.persistence + jakarta.persistence-api + 3.2.0 + + + + org.hibernate + hibernate-core + 7.1.11.Final + + + + org.postgresql + postgresql + 42.7.8 + + + org.projectlombok + lombok + 1.18.42 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + 1.18.42 + + + + + + \ No newline at end of file diff --git a/src/main/java/bzh/risotto/Main.java b/src/main/java/bzh/risotto/Main.java index 2cf69e6..a58546d 100644 --- a/src/main/java/bzh/risotto/Main.java +++ b/src/main/java/bzh/risotto/Main.java @@ -1,17 +1,33 @@ package bzh.risotto; -//TIP To Run code, press or -// click the icon in the gutter. -public class Main { - static void main() { - //TIP Press 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 to start debugging your code. We have set one breakpoint - // for you, but you can always add more by pressing . - 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(); } } diff --git a/src/main/java/bzh/risotto/dao/AbstractDAO.java b/src/main/java/bzh/risotto/dao/AbstractDAO.java new file mode 100644 index 0000000..c668384 --- /dev/null +++ b/src/main/java/bzh/risotto/dao/AbstractDAO.java @@ -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 implements DAO { + private final Class entityClass; + protected EntityManager entityManager; + + public AbstractDAO(Class entityClass, EntityManager entityManager) { + this.entityClass = entityClass; + this.entityManager = entityManager; + } + + @Override + public Optional find(K id) { + return Optional.ofNullable(entityManager.find(entityClass, id)); + } + + @Override + public List 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; + } + } +} diff --git a/src/main/java/bzh/risotto/dao/ClientDAO.java b/src/main/java/bzh/risotto/dao/ClientDAO.java new file mode 100644 index 0000000..94ecade --- /dev/null +++ b/src/main/java/bzh/risotto/dao/ClientDAO.java @@ -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 { + public ClientDAO(EntityManager entityManager) { + super(Client.class, entityManager); + } + + public List findByAgent(int numAgent) { + return entityManager.createQuery( + "SELECT c FROM Client c WHERE c.agent.numAgent = :numAgent", Client.class) + .setParameter("numAgent", numAgent) + .getResultList(); + } +} diff --git a/src/main/java/bzh/risotto/dao/DAO.java b/src/main/java/bzh/risotto/dao/DAO.java new file mode 100644 index 0000000..1658ff3 --- /dev/null +++ b/src/main/java/bzh/risotto/dao/DAO.java @@ -0,0 +1,12 @@ +package bzh.risotto.dao; + +import java.util.List; +import java.util.Optional; + +public interface DAO { + Optional find(K id); + List findAll(); + void save(T entity); + void update(T entity); + void delete(T entity); +} diff --git a/src/main/java/bzh/risotto/dto/ClientDTO.java b/src/main/java/bzh/risotto/dto/ClientDTO.java new file mode 100644 index 0000000..21a37e9 --- /dev/null +++ b/src/main/java/bzh/risotto/dto/ClientDTO.java @@ -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 +} diff --git a/src/main/java/bzh/risotto/mapper/ClientMapper.java b/src/main/java/bzh/risotto/mapper/ClientMapper.java new file mode 100644 index 0000000..fe4114f --- /dev/null +++ b/src/main/java/bzh/risotto/mapper/ClientMapper.java @@ -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; + } +} diff --git a/src/main/java/bzh/risotto/model/Agence.java b/src/main/java/bzh/risotto/model/Agence.java new file mode 100644 index 0000000..170ed93 --- /dev/null +++ b/src/main/java/bzh/risotto/model/Agence.java @@ -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; +} diff --git a/src/main/java/bzh/risotto/model/Agent.java b/src/main/java/bzh/risotto/model/Agent.java new file mode 100644 index 0000000..fb18750 --- /dev/null +++ b/src/main/java/bzh/risotto/model/Agent.java @@ -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; +} diff --git a/src/main/java/bzh/risotto/model/Client.java b/src/main/java/bzh/risotto/model/Client.java new file mode 100644 index 0000000..9e30459 --- /dev/null +++ b/src/main/java/bzh/risotto/model/Client.java @@ -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 comptes; + + // Constructeurs, getters et setters +} diff --git a/src/main/java/bzh/risotto/model/Compte.java b/src/main/java/bzh/risotto/model/Compte.java new file mode 100644 index 0000000..080fe3b --- /dev/null +++ b/src/main/java/bzh/risotto/model/Compte.java @@ -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 operations; + + @ManyToMany(mappedBy = "comptes") + private List clients; + + // Constructeurs, getters et setters +} diff --git a/src/main/java/bzh/risotto/model/Operation.java b/src/main/java/bzh/risotto/model/Operation.java new file mode 100644 index 0000000..53a7b8f --- /dev/null +++ b/src/main/java/bzh/risotto/model/Operation.java @@ -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; +} diff --git a/src/main/java/bzh/risotto/service/ClientService.java b/src/main/java/bzh/risotto/service/ClientService.java new file mode 100644 index 0000000..6b01ac0 --- /dev/null +++ b/src/main/java/bzh/risotto/service/ClientService.java @@ -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 getAllClients() { + return clientDAO.findAll().stream() + .map(ClientMapper::toDTO) + .collect(Collectors.toList()); + } + + public List getClientsByAgent(int numAgent) { + return clientDAO.findByAgent(numAgent).stream() + .map(ClientMapper::toDTO) + .collect(Collectors.toList()); + } +} diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..71c5ccd --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,20 @@ + + + org.hibernate.jpa.HibernatePersistenceProvider + bzh.risotto.model.Client + bzh.risotto.model.Compte + bzh.risotto.model.Operation + bzh.risotto.model.Agent + bzh.risotto.model.Agence + + + + + + + + + + + + \ No newline at end of file