2.8. ORM framework-ök, perzisztencia felületek

2.8.1. Hibernate

2.8.1.1. Építse fel az igényelt adatbázis kapcsolatot a JDeveloper környezetben.

A JDeveloper View menüpontjában válasszuk ki a Database Navigator pontot.

Ezután hívjuk meg a New Connection funkciót egy új adatbázis kapcsolat létrehozatalára.

Állítsuk be a kapcsolat főbb paramétereit.

  1. Connection name : kl1 (kapcsolat azonosító)

  2. Connection type: Oracle JDBC (kapcsolat típusa)

  3. Username: proba (adatbázis felhasználó neve)

  4. Password: proba (ejlszó)

  5. Driver: Thin (jdbc megható tipusa)

  6. Hostname: localhost (szerver gép)

  7. JDBC port: 1521 (a figyelő portszáma)

  8. SID: XE

2.8.1.2. Építse fel az adatmodell a JDeveloper környezetben.

Egy új Java osztályt kell létrehozni., mely illeszkedik az EJB körrnyezetre. A generálás lépései:

  1. A New funkció aktivizálás a minta alkalmazáson belül

  2. Az új elem típusa: Business Tier - EJBMode - Entiites from tables. A megjelenő paraméter beállító lapokon az alábbi információkat kell megadni:

  3. Persistence unit: a perzisztens adatkezelő rész azonosítója

  4. Adatkapcsolat típusa (pl. online vagy offline)

  5. adatbázis kapcsolati objektum

  6. adattáblák kijelölése, melyekhez perzisztens osztályok jönnek majd létre

A generálás eredményeként létrejön a perzisztenciát támogató osztályok annotált leírása.

   package jpa_kl;
   import java.io.Serializable;
   import javax.persistence.Column;
   import javax.persistence.Entity;
   import javax.persistence.Id;
   import javax.persistence.NamedQueries;
   import javax.persistence.NamedQuery;
   
   @Entity
   @NamedQueries({
      @NamedQuery(name = "Termek.findAll", query = "select o from Termek o")
   })
   
   public class Termek implements Serializable {
      private String megyseg;
      @Id
      @Column(nullable = false)
      private Long tkod;
      private String tnev;
   
   
      public Termek() {
      }
   
      public Termek(String megyseg, Long tkod, String tnev) {
        this.megyseg = megyseg;
        this.tkod = tkod;
        this.tnev = tnev;
      }
   
      public String getMegyseg() {
        return  megyseg;
      }
   
      public void setMegyseg(String megyseg) {
        this.megyseg = megyseg;
      }
   
      public Long getTkod() {
        return  tkod;
      }
   
      public void setTkod(Long tkod) {
        this.tkod = tkod;
      }
   
      public String getTnev() {
        return  tnev;
      }
   
      public void setTnev(String tnev) {
        this.tnev = tnev;
      }
   }

2.8.1.3. Ellenőrizze a létrejött persistence.xml konfigurációs állományt.

<?xml version="1.0" encoding="windows-1250" ?>
   
   <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
      <persistence-unit name="JPA_KL">
        <provider>
          org.eclipse.persistence.jpa.PersistenceProvider
        </provider>
        <jta-data-source>
          java:/app/jdbc/jdbc/kl1DS
        </jta-data-source>
        <class>
          JPA_KL.Termek
        </class>
        <properties> 
          <property name="eclipselink.target-server" value="WebLogic_10"/>
          <property name="javax.persistence.jtaDataSource"
            value="java:/app/jdbc/jdbc/kl1DS"/>
        </properties>
     </persistence-unit>
   </persistence>

2.8.1.4. Hozza létre az entitásokat kezelő menedzser osztályt.

A projekt META-INF részében a persistence.xml állományra álljunk rá, s aktivizáljuk a New Java Service Facade funckiót a jobbegérgombon keresztül. A paraméterbeállító ablakokban az alábbi értékekeket jelöljük be:

  1. JPA

  2. generate main()

  3. JDBC connection

  4. Table generation: none

A generált mintapélda példányosítja az entitás kezelő osztályt is. A kapcsolódó kódlista:

   package jpa_kl;
   import java.util.List;
   import javax.persistence.EntityManager;
   import javax.persistence.EntityManagerFactory;
   import javax.persistence.EntityTransaction;
   import javax.persistence.Persistence;
   import javax.persistence.Query;
   
   public class JavaServiceFacade {
      private EntityManagerFactory emf = 
      Persistence.createEntityManagerFactory("public JavaServiceFacade() {
   }
   
   public static void main(String [] args) {
      final JavaServiceFacade javaServiceFacade = new JavaServiceFacade();
      // TODO: Call methods on javaServiceFacade here...
   }
   
   private EntityManager getEntityManager() {
      return  emf.createEntityManager();
   }
   
   public Object mergeEntity(Object entity) {
      final EntityManager em = getEntityManager();
      try {
         final EntityTransaction et = em.getTransaction();
         try {
            et.begin();
            em.merge(entity);
            et.commit();
         } finally {
            if (et != null && et.isActive()) {
               entity = null;
               et.rollback();
            }
        }
      } finally {
        if (em != null && em.isOpen()) {
          em.close();
        }
      }
      return  entity;
   }
   
   public Object persistEntity(Object entity) {
      final EntityManager em = getEntityManager();
      try {
         final EntityTransaction et = em.getTransaction();
         try {
            et.begin();
            em.persist(entity);
            et.commit();
         } finally {
            if (et != null && et.isActive()) {
               entity = null;
               et.rollback();
            }
        }
      } finally {
        if (em != null && em.isOpen()) {
           em.close();
        }
      }
      return  entity;
   }
   
   
   /** <code>select o from Termek o</code> */
   public List<Termek> queryTermekFindAll() {
      return  
      getEntityManager().createNamedQuery("Termek.findAll").getResultList();
   }
   
   
   /** <code>select o from Termek o</code> */
   public List<Termek> queryTermekFindAllByRange(int firstResult,
   int maxResults) {
       Query query = getEntityManager().createNamedQuery("Termek.findAll");
       if (firstResult > 0) {
          query = query.setFirstResult(firstResult);
       }
       if (maxResults > 0) {
          query = query.setMaxResults(maxResults);
       }
       return  query.getResultList();
   }
   
   
   public void removeTermek(Termek termek) {
       final EntityManager em = getEntityManager();
       try {
          final EntityTransaction et = em.getTransaction();
          try {
            et.begin();
            termek = em.find(Termek.class, termek.getTkod());
            em.remove(termek);
            et.commit();
          } finally {
             if (et != null && et.isActive()) {
                et.rollback();
             }
          }
        } finally {
           if (em != null && em.isOpen()) {
              em.close();
           }
        }
      }
   }
      

A persistence.xml konfigurációs állomány tartalma is megváltozott. Az új leírás:

   <?xml version="1.0" encoding="windows-1250" ?>
   <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
     <persistence-unit name="JPA_KL">
       <provider>
         org.eclipse.persistence.jpa.PersistenceProvider
       </provider>
       <jta-data-source>
         java:/app/jdbc/jdbc/kl1DS
       </jta-data-source>
       <class>
         jpa_kl.Termek
       </class>
       <properties>
         <property name="eclipselink.target-server" value="WebLogic_10"/>
         <property name="javax.persistence.jtaDataSource"
   value="java:/app/jdbc/jdbc/kl1DS"/>
       </properties>
     </persistence-unit>
     <persistence-unit name="JPA_KL-1" transaction-type="RESOURCE_LOCAL">
       <provider>
        org.eclipse.persistence.jpa.PersistenceProvider
       </provider>
       <class>
         jpa_kl.Termek
       </class>
       <properties>
         <property name="eclipselink.jdbc.driver"
          value="oracle.jdbc.OracleDriver"/>
         <property name="eclipselink.jdbc.url"
          value="jdbc:oracle:thin:@localhost:1521:XE"/>
         <property name="eclipselink.jdbc.user" value="proba"/>
         <property name="eclipselink.jdbc.password"
          value="6811C4C05D5E63CC5650D51F031506B0"/>
         <property name="eclipselink.logging.level" value="FINER"/>
         <property name="eclipselink.target-server" value="WebLogic_10"/>
       </properties>
     </persistence-unit>
   </persistence>
   

2.8.1.5. Módosítsa úgy a kliens osztályt, hogy az listázza ki az adatbázsiban tárolt termékek neveit.

Ehhez a main() metódust módosítjuk, melynek új alakja:

   public static void main(String [] args) {
      final JavaServiceFacade javaServiceFacade = new JavaServiceFacade();
      List <Termek> ll;
      
      ll = javaServiceFacade.queryTermekFindAll();
      for (int i=0; i<ll.size(); i++) {
        Termek tt = ll.get(i);
        System.out.println(tt.getTnev());
      }
   }

2.8.1.6. Vigyen fele egy új terméket az adatbázisba perziszetens objektumon keresztül.

public static void main(String [] args) {
      final JavaServiceFacade javaServiceFacade = new JavaServiceFacade();
      Termek tt = new Termek("db",45l,"babszem");
      javaServiceFacade.persistEntity(tt);
   }

2.8.1.7. Kérdezze le a termékek darabszámát egy native SQL lekérdezésen keresztül.

public void lekerdo (String betu){
      final EntityManager em = getEntityManager();
      String parancs = "SELECT to_char(count(*)) FROM termek ";
      List ll = (List) em.createNativeQuery(parancs).getSingleResult();
      System.out.println("db="+ ll.get(0));
   }

2.8.1.8. Kérdezze le a egy adott mennyiségi egységhez tartozó termékek neveit egy paraméteres native SQL lekérdezésen keresztül.

public void lekerdo (String me){
      final EntityManager em = getEntityManager();
      String parancs = 
        "SELECT tnev FROM termek WHERE ltrim(rtrim(megyseg)) = ?”
      List ll = 
       (List) em.createNativeQuery(parancs).
         setParameter(1,me.trim());
      for (int i=0; i<ll.size(); i++) {
         System.out.println(ll.get(i));
      }
   }

2.8.2. JPA

2.8.2.1. Entity létrehozás

2.8.2.1.1. Hozzon létre „Entity” osztályt a „vevő” táblára!
   @Entity
   @Table(name="vevo")
   public class Vevo implements Serializable {        
   
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="ugyfelszam")
           private int ugyfelszam;
           private String nev;
           private String e_mail;
           private int tel;
           
           @Column(name="i")
           private int irsz;
           
           @Column(name="v")
           private String varos;
           
           @Column(name="u")
           private String utca;
           private int hsz;
                   
           public Vevo() {
                   super();
           }
   
           public int getUgyfelszam() {
                   return  ugyfelszam;
           }
   
           public void setUgyfelszam(int ugyfelszam) {
                   this.ugyfelszam = ugyfelszam;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public String getE_mail() {
                   return  e_mail;
           }
   
           public void setE_mail(String e_mail) {
                   this.e_mail = e_mail;
           }
   
           public int getTel() {
                   return  tel;
           }
   
           public void setTel(int tel) {
                   this.tel = tel;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           @Override
           public String toString() {
   return  "Vevo [ugyfelszam=" + ugyfelszam + ", nev=" + nev + ", 
   e_mail="+ e_mail + ", tel=" + tel + ", irsz=" + irsz + 
   ", varos="+ varos + ", utca=" + utca + ", hsz=" + hsz
   + "]";
           }
   }
2.8.2.1.2. Hozzon létre „Entity” osztályt a „szolgáltató” táblára!
@Entity
   @Table(name="szolgaltato")
   public class Szolgaltato implements Serializable {
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="cegazonosito")
           private String cegazonosito;
           private String nev;
           @Column(name="i")
           private int irsz;
           @Column(name="v")
           private String varos;
           @Column(name="u")
           private String utca;
           private int hsz;
           
           public Szolgaltato() {
                   super();
           }
   
           public String getCegazonosito() {
                   return  cegazonosito;
           }
   
           public void setCegazonosito(String cegazonosito) {
                   this.cegazonosito = cegazonosito;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           public Collection<Tel> getTels() {
                   return  tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
           
           @Override
           public String toString() {
                   return  "Szolgaltato [cegazonosito=" + cegazonosito + ", nev=" + 
   nev+ ", irsz=" + irsz + ", varos=" + varos + ", 
   utca=" + utca+ ", hsz=" + hsz + "]";
           }
   }
2.8.2.1.3. Hozzon létre „Entity” osztályt a „mobiltelefon” táblára!
@Entity
   @Table(name="mobiltelefon")
   public class Mobiltelefon implements Serializable {
           private static final long serialVersionUID = 1L;
   
           @Id
           @Column(name="cikkszam")
           private String cikkszam;
   
           private int ar;
   
           private String leiras;
   
           private String tipusa;
           
   public Mobiltelefon() {
                   super();
               }
   
           public String getCikkszam() {
                   return  this.cikkszam;
           }
   
           public void setCikkszam(String cikkszam) {
                   this.cikkszam = cikkszam;
           }
   
           public int getAr() {
                   return  this.ar;
           }
   
           public void setAr(int ar) {
                   this.ar = ar;
           }
   
           public String getLeiras() {
                   return  this.leiras;
           }
   
           public void setLeiras(String leiras) {
                   this.leiras = leiras;
           }
   
           public String getTipusa() {
                   return  this.tipusa;
           }
   
           public void setTipusa(String tipusa) {
                   this.tipusa = tipusa;
           }
   
   @Override
           public String toString() {
                   return  "Mobiltelefon [cikkszam=" + cikkszam + ", ar=" + ar
                                   + ", leiras=" + leiras + ", tipusa=" + tipusa
                                   + ", szolgaltatok=" + szolgaltatok + "]";
           }
   
   }

2.8.2.2. Kapcsolatok kezelése

2.8.2.2.1. Hozzon létre „Entity” osztályt a „tel” táblára, figyeljen az 1:N kapcsolat annotálására, legyen kétirányú a kapcsolat!
@Entity
   @Table(name="tel")
   public class Tel implements Serializable {
   
           private static final long serialVersionUID = 1L;
   
           @Id
           @GeneratedValue(strategy=GenerationType.SEQUENCE)
           @Column(name="id")
           private int id;
           
           private int telszam;
   
           @ManyToOne
           @JoinColumn(name="szolgaltato",
                               referencedColumnName="cegazonosito")
           private Szolgaltato szolgaltato;
           
           public Tel() {
                   super();
           }
   
           public int getId() {
                   return  id;
           }
   
           public void setId(int id) {
                   this.id = id;
           }
   
           public int getTelszam() {
                   return  telszam;
           }
   
           public void setTelszam(int telszam) {
                   this.telszam = telszam;
           }
   
           public Szolgaltato getSzolgaltato() {
                   return  szolgaltato;
           }
           
           public void setSzolgaltato(Szolgaltato szolgaltato) {
                   this.szolgaltato = szolgaltato;
           }
           
           @Override
           public String toString() {
                   return  "Tel [id=" + id + ", telszam=" + telszam + ", szolgaltato="
                                   + szolgaltato + "]";
           }
   
   “Szolgaltato osztály” osztály módosítása a kétirányú kapcsolat miatt:
   
   @OneToMany(mappedBy="szolgaltato", fetch=FetchType.EAGER)
           private Collection<Tel>tels;
           …
   public Szolgaltato() {
                   super();
                   tels = new ArrayList<Tel>();
           }
   …
           public Collection<Tel> getTels() {
                   return  tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
           public void addTel(Tel t) {
                   if (!this.tels.contains(t)) {
                           this.tels.add(t);
                           if (t.getSzolgaltato() != null) {
                                   t.getSzolgaltato().getTels().remove(t);
                           }
                           t.setSzolgaltato(this);
                   }
           }
2.8.2.2.2. Egészítse ki a megfelelő osztályokat, hogy kezeljék az „árusít” kapcsolatot! Figyeljen az N:M kapcsolat annotálására!
Szolgáltató osztály:
   @Entity
   @Table(name="szolgaltato")
   public class Szolgaltato implements Serializable {
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="cegazonosito")
           private String cegazonosito;
           private String nev;
           @Column(name="i")
           private int irsz;
           @Column(name="v")
           private String varos;
           @Column(name="u")
           private String utca;
           private int hsz;
   
           @OneToMany(mappedBy="szolgaltato", fetch=FetchType.EAGER)
           private Collection<Tel>tels; 
           
           @ManyToMany
           @JoinTable(
                           name="arusit",
                           joinColumns=@JoinColumn(
                                                   name="szolgaltato",
                                                   referencedColumnName="cegazonosito"),
                           inverseJoinColumns=@JoinColumn(
                                                   name="mobiltelefon",
                                                   referencedColumnName="cikkszam")
                           )
           private Collection<Mobiltelefon> mobiltelefonok;
           
           
           public Szolgaltato() {
                   super();
                   tels = new ArrayList<Tel>();
                   mobiltelefonok = new ArrayList<Mobiltelefon>();
           }
   
           public String getCegazonosito() {
                   return  cegazonosito;
           }
   
           public void setCegazonosito(String cegazonosito) {
                   this.cegazonosito = cegazonosito;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           public Collection<Tel> getTels() {
                   return  tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
   
           public Collection<Mobiltelefon> getMobiltelefonok() {
                   return  mobiltelefonok;
           }
   
           public void setMobiltelefonok(Collection<Mobiltelefon> mobiltelefonok) {
                   this.mobiltelefonok = mobiltelefonok;
           }
   
           
           public void addTel(Tel t) {
                   if (!this.tels.contains(t)) {
                           this.tels.add(t);
                           if (t.getSzolgaltato() != null) {
                                   t.getSzolgaltato().getTels().remove(t);
                           }
                           t.setSzolgaltato(this);
                   }
           }
           
           public void addMobiltelefon(Mobiltelefon m) {
                   if (!this.mobiltelefonok.contains(m)) {
                           this.mobiltelefonok.add(m);
                   }
                   if (!m.getSzolgaltatok().contains(this)) {
                           m.addSzolgaltato(this);
                   }
           }
           
           
           @Override
           public String toString() {
           +        return  "Szolgaltato [cegazonosito=" + cegazonosito + ", nev=" + 
   nev+ ", irsz=" + irsz + ", varos=" + varos + ", 
   utca=" + utca+ ", hsz=" + hsz + "]";
           }
   }
   Mobiltelefon osztály:
   @Entity
   @Table(name="mobiltelefon")
   public class Mobiltelefon implements Serializable {
           private static final long serialVersionUID = 1L;
   
           @Id
           @Column(name="cikkszam")
           private String cikkszam;
   
           private int ar;
   
           private String leiras;
   
           private String tipusa;
   
           @ManyToMany(mappedBy="mobiltelefonok", fetch=FetchType.EAGER)
           private Collection<Szolgaltato> szolgaltatok;
                   
   public Mobiltelefon() {
                   super();
                   szolgaltatok = new ArrayList<Szolgaltato>();
   }
   
           public String getCikkszam() {
                   return  this.cikkszam;
           }
   
           public void setCikkszam(String cikkszam) {
                   this.cikkszam = cikkszam;
           }
   
           public int getAr() {
                   return  this.ar;
           }
   
           public void setAr(int ar) {
                   this.ar = ar;
           }
   
           public String getLeiras() {
                   return  this.leiras;
           }
   
           public void setLeiras(String leiras) {
                   this.leiras = leiras;
           }
   
           public String getTipusa() {
                   return  this.tipusa;
           }
   
           public void setTipusa(String tipusa) {
                   this.tipusa = tipusa;
           }
   
           public Collection<Szolgaltato> getSzolgaltatok() {
                   return  szolgaltatok;
           }
   
           public void setSzolgaltatok(Collection<Szolgaltato> szolgaltatok) {
                   this.szolgaltatok = szolgaltatok;
           }
           
           public void addSzolgaltato(Szolgaltato sz) {
                   if (!this.szolgaltatok.contains(sz)) {
                           this.szolgaltatok.add(sz);
                   }
                   if (!sz.getMobiltelefonok().contains(this)) {
                           sz.getMobiltelefonok().add(this);
                   }
           }
   
           @Override
           public String toString() {
                   return  "Mobiltelefon [cikkszam=" + cikkszam + ", ar=" + ar
                                   + ", leiras=" + leiras + ", tipusa=" + tipusa
                                   + ", szolgaltatok=" + szolgaltatok + "]";
           }
   }
2.8.2.2.3. Egészítse ki a megfelelő osztályokat, hogy kezeljék az „elégedettség” kapcsolatot! Figyeljen az N:M kapcsolat annotálására!
Vevő osztály:
   @Entity
   @Table(name="vevo")
   public class Vevo implements Serializable {
   
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="ugyfelszam")
           private int ugyfelszam;
           private String nev;
           private String e_mail;
           private int tel;
           
           @Column(name="i")
           private int irsz;
           
           @Column(name="v")
           private String varos;
           
           @Column(name="u")
           private String utca;
           private int hsz;
           
           @ManyToMany(fetch=FetchType.EAGER)
           @JoinTable(
                           name="elegedettseg",
                           joinColumns=@JoinColumn(
                                           name="vevo",
                                           referencedColumnName="ugyfelszam"),
                           inverseJoinColumns=@JoinColumn(
                                           name="szolgaltato",
                                           referencedColumnName="cegazonosito")
           )
           private Collection<Szolgaltato>szolgaltatok;
           
           public Vevo() {
                   super();
                   this.szolgaltatok = new ArrayList<Szolgaltato>();
           }
   
           public int getUgyfelszam() {
                   return  ugyfelszam;
           }
   
           public void setUgyfelszam(int ugyfelszam) {
                   this.ugyfelszam = ugyfelszam;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public String getE_mail() {
                   return  e_mail;
           }
   
           public void setE_mail(String e_mail) {
                   this.e_mail = e_mail;
           }
   
           public int getTel() {
                   return  tel;
           }
   
           public void setTel(int tel) {
                   this.tel = tel;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
           
           public Collection<Szolgaltato> getSzolgaltatok() {
                   return  szolgaltatok;
           }
   
           public void setSzolgaltatok(Collection<Szolgaltato> szolgaltatok) {
                   this.szolgaltatok = szolgaltatok;
           }
   
           public void addSzolgaltato(Szolgaltato sz) {
                   if (!this.szolgaltatok.contains(sz)) {
                           this.szolgaltatok.add(sz);
                   }
                   if (!sz.getVevok().contains(this)) {
                           sz.getVevok().add(this);
                   }
           }
           
           @Override
           public String toString() {
                   return  "Vevo [ugyfelszam=" + ugyfelszam + ", nev=" + nev + ", 
   e_mail="+ e_mail + ", tel=" + tel + ", irsz=" + irsz
   + ", varos="+ varos + ", utca=" + utca + ", hsz=" + 
   hsz + "]";
           }
   }
   Szolgáltató osztály:
   @Entity
   @Table(name="szolgaltato")
   public class Szolgaltato implements Serializable {
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="cegazonosito")
           private String cegazonosito;
           private String nev;
           @Column(name="i")
           private int irsz;
           @Column(name="v")
           private String varos;
           @Column(name="u")
           private String utca;
           private int hsz;
   
           @OneToMany(mappedBy="szolgaltato", fetch=FetchType.EAGER)
           private Collection<Tel> tels; 
           
           @ManyToMany
           @JoinTable(
                           name="arusit",
                           joinColumns=@JoinColumn(
                                                   name="szolgaltato",
                                                   referencedColumnName="cegazonosito"),
                           inverseJoinColumns=@JoinColumn(
                                                   name="mobiltelefon",
                                                   referencedColumnName="cikkszam")
                           )
           private Collection<Mobiltelefon>mobiltelefonok;
           
           
           @ManyToMany(mappedBy="szolgaltatok")
           private Collection<Vevo> vevok;
           
           public Szolgaltato() {
                   super();
                   tels = new ArrayList<Tel>();
                   mobiltelefonok = new ArrayList<Mobiltelefon>();
                   vevok = new ArrayList<Vevo>();
           }
   
           public String getCegazonosito() {
                   return  cegazonosito;
           }
   
           public void setCegazonosito(String cegazonosito) {
                   this.cegazonosito = cegazonosito;
           }
   
           public String getNev() {
                   return nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public int getIrsz() {
                   return irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           public Collection<Tel> getTels() {
                   return tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
   
           public Collection<Mobiltelefon> getMobiltelefonok() {
                   return mobiltelefonok;
           }
   
           public void setMobiltelefonok(Collection<Mobiltelefon> mobiltelefonok) {
                   this.mobiltelefonok = mobiltelefonok;
           }
   
           public Collection<Vevo> getVevok() {
                   return vevok;
           }
   
           public void setVevok(Collection<Vevo> vevok) {
                   this.vevok = vevok;
           }
           
           public void addTel(Tel t) {
                   if (!this.tels.contains(t)) {
                           this.tels.add(t);
                           if (t.getSzolgaltato() != null) {
                                   t.getSzolgaltato().getTels().remove(t);
                           }
                           t.setSzolgaltato(this);
                   }
           }
           
           public void addMobiltelefon(Mobiltelefon m) {
                   if (!this.mobiltelefonok.contains(m)) {
                           this.mobiltelefonok.add(m);
                   }
                   if (!m.getSzolgaltatok().contains(this)) {
                           m.addSzolgaltato(this);
                   }
           }
           
           public void addVevo(Vevo v) {
                   if (!this.vevok.contains(v)) {
                           this.vevok.add(v);
                   }
                   if (!v.getSzolgaltatok().contains(this)) {
                           v.getSzolgaltatok().add(this);
                   }
           }
           
           @Override
           public String toString() {
                   return "Szolgaltato [cegazonosito=" + cegazonosito + ", nev=" + 
   nev+ ", irsz=" + irsz + ", varos=" + varos + ", 
   utca=" + utca+ ", hsz=" + hsz + "]";
           }
   }

2.8.2.3. Persistence XML

2.8.2.3.1. Írja meg a „persistence.xml” fájlt a JPA használatához!
<?xml version="1.0" encoding="UTF-8"?>
   <persistence version="2.0" xmlns= xmlns:xsi= xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
           <persistence-unitname="Feladatok"transaction-type="RESOURCE_LOCAL">
                   <class>feladatok.jpa.model.Mobiltelefon</class>
                   <class>feladatok.jpa.model.Vevo</class>
                   <class>feladatok.jpa.model.Szolgaltato</class>
                   <class>feladatok.jpa.model.Tel</class>
                   <properties>
   <propertyname="javax.persistence.jdbc.url"
   value="jdbc:mysql://localhost:3306/feladatok"/>
                           <propertyname="javax.persistence.jdbc.user"value="proba"/>
                           <propertyname="javax.persistence.jdbc.password"
   value="feladatok"/>
                           <propertyname="javax.persistence.jdbc.driver"
   value="com.mysql.jdbc.Driver"/>
                           <propertyname="eclipselink.ddl-generation"value="create-
   tables"/>
                           <propertyname="eclipselink.ddl-generation.output-mode"
   value="database"/>
                   </properties>
           </persistence-unit>
   </persistence>

2.8.2.4. Kezelő osztályok léterhozása

2.8.2.4.1. Hozzon létre egy „VevoKezelo” osztályt, amely a vevo táblát kezeli: felvitel, módosítás, törlés, összes adat lekérdezés!
public class VevoKezelo {
           private EntityManager em;
           
           public VevoKezelo(EntityManager em) {
                   this.em = em;
           }
           
           public void insert(Vevo v) {
                   if (v != null) {
                           em.persist(v);
                   }
           }
           public void insert(int ugyfelszam, String nev, String email, int tel, 
                                   int irsz, String varos, String utca, int hsz) {
                   Vevo v = new Vevo();
                   v.setUgyfelszam(ugyfelszam);
                   v.setNev(nev);
                   v.setE_mail(email);
                   v.setTel(tel);
                   v.setIrsz(irsz);
           +        v.setVaros(varos);
                   v.setUtca(utca);
                   v.setHsz(hsz);
                   this.insert(v);
           }
           
           public Vevo update(Vevo v) {
                   if (v != null) {
                           return em.merge(v);
                   }
                   return null;
           }
           
           public void remove(Vevo v) {
                   if (v != null)
                           em.remove(v);
           }
           
           public void remove(int ugyfelszam) {
                   this.remove(find(ugyfelszam));
           }
           
           public Vevo find(int ugyfelszam) {
                   return em.find(Vevo.class, ugyfelszam);
           }
           
           @SuppressWarnings("unchecked")
           public Collection<Vevo> findAll() {
                   return (Collection<Vevo>)em.createQuery("select v from Vevo 
   v").getResultList();
           }
   }
2.8.2.4.2. Hozzon létre egy „SzolgaltatoKezelo” osztályt, amely a szolgáltató táblát kezeli: felvitel, módosítás, törlés, összes adat lekérdezés!
   public class SzolgaltatoKezelo {
           private EntityManager em;
           
           public SzolgaltatoKezelo(EntityManager em) {
                   this.em = em;
           }
           
           public void insert(Szolgaltato sz) {
                   if (sz != null) {
                           em.persist(sz);
                   }
           }
   
   public void insert(String cegazonosito, String nev, int irsz, 
    Stringvaros, String utca, int hsz) {
                   Szolgaltato sz = new Szolgaltato();
                   sz.setCegazonosito(cegazonosito);
                   sz.setNev(nev);
                   sz.setVaros(varos);
                   sz.setUtca(utca);
                   sz.setHsz(hsz);
                   this.insert(sz);
           }
           
           public void remove(Szolgaltato sz) {
                   if (sz != null) {
                           em.remove(sz);
                   }
           }
           
           public void remove(String cegazonosito) {
                   this.remove(find(cegazonosito));
           }
           
           public Szolgaltato find(String cegazonosito) {
                   return em.find(Szolgaltato.class, cegazonosito);
           }
           
           @SuppressWarnings("unchecked")
           public Collection<Szolgaltato> findAll() {
                   return  (Collection<Szolgaltato>)em.createQuery("select sz from 
   Szolgaltato sz").getResultList();
           }
   }
2.8.2.4.3. Egészítse ki a „SzolgaltatoKezelo” osztályt, hogy kezelje az árusításokat!
public class SzolgaltatoKezelo {
           private EntityManager em;
           
           public SzolgaltatoKezelo(EntityManager em) {
                   this.em = em;
           }
           
           public void insert(Szolgaltato sz) {
                   if (sz != null) {
                           em.persist(sz);
                   }
           }
   
           public void insert(String cegazonosito, String nev, int irsz, 
    String varos, String utca, int hsz) {
                   Szolgaltato sz = new Szolgaltato();
                   sz.setCegazonosito(cegazonosito);
                   sz.setNev(nev);
                   sz.setVaros(varos);
                   sz.setUtca(utca);
                   sz.setHsz(hsz);
                   this.insert(sz);
           }
           
           public void remove(Szolgaltato sz) {
                   if (sz != null) {
                           em.remove(sz);
                   }
           }
           
           public void remove(String cegazonosito) {
                   this.remove(find(cegazonosito));
           }
           
           public Szolgaltato find(String cegazonosito) {
                   return em.find(Szolgaltato.class, cegazonosito);
           }
           
           @SuppressWarnings("unchecked")
           public Collection<Szolgaltato> findAll() {
                   return  (Collection<Szolgaltato>)em.createQuery("select sz from 
   Szolgaltato sz").getResultList();
           }
           
           // Kiegészítés, hogy az árusításokat is kezelje
           
           public void elad(Szolgaltato sz, Mobiltelefon m) {
                   sz.addMobiltelefon(m);
           }
           
           public Collection<Mobiltelefon> eladottTelefonok(Szolgaltato sz) {
                   return  sz.getMobiltelefonok();
           }
           
           publicboolean isTelefonEladott(Mobiltelefon m) {
                   for (Szolgaltato sz : findAll() ) {
                           if (sz.getMobiltelefonok().contains(m))
                                   return true;
                   }
                   return false;
           }
   }
   
2.8.2.4.4. Készítsen egy „Kezelo” generikus absztrakt osztályt és származtassa le a „VevoKezelo” és a „SzolgaltatoKezelo” osztályokat belőle! Módosítsa a megoldáshoz a már elkészült leszármazott osztályokat!
Kezelő osztály:
   public abstract class Kezelo<T> {
           private Class<T> type;
           protected EntityManager em;
           
           protected Kezelo(EntityManager em, Class<T> type) {
                   this.em=em;
                   this.type = type;
           }
           
           public void insert(T item) {
                   if (item != null)
                           em.persist(item);
           }
           
           public T update(T item) {
                   if (item != null)
                           return em.merge(item);
                   else
                           return null;
           }
           
           public void remove(T item) {
                   if (item!=null)
                           em.remove(em.merge(item));
           }
           
           public T find(Object key) {
                   return em.find(type, key);
           }
           
           public abstract Collection<T> findAll();  
   }
   
   Módosított VevőKezelő osztály:
   public class VevoKezelo extends Kezelo<Vevo> {
           
           public VevoKezelo(EntityManager em) {
                   super(em,Vevo.class);
           }
           
           public void insert(int ugyfelszam, String nev, String email, int tel, 
                           int irsz, String varos, String utca, int hsz) {
                   Vevo v = new Vevo();
                   v.setUgyfelszam(ugyfelszam);
                   v.setNev(nev);
                   v.setE_mail(email);
                   v.setTel(tel);
                   v.setIrsz(irsz);
                   v.setVaros(varos);
                   v.setUtca(utca);
                   v.setHsz(hsz);
                   super.insert(v);
           }
           
           public void remove(int ugyfelszam) {
                   super.remove(find(ugyfelszam));
           }
           
           @Override
           @SuppressWarnings("unchecked")
           public Collection<Vevo> findAll() {
                   return  (Collection<Vevo>)em.createQuery("select v from Vevo 
   v").getResultList();
           }
   }
   
   Módosított SzolgáltatóKezelő osztály:
   public class SzolgaltatoKezelo extends Kezelo<Szolgaltato> {
   
           public SzolgaltatoKezelo(EntityManager em) {
                   super(em,Szolgaltato.class);
           }
   
           public void insert(String cegazonosito, String nev, int irsz, 
          String varos, String utca, int hsz) {
                   Szolgaltato sz = new Szolgaltato();
                   sz.setCegazonosito(cegazonosito);
                   sz.setNev(nev);
                   sz.setVaros(varos);
                   sz.setUtca(utca);
                   sz.setHsz(hsz);
                   super.insert(sz);
           }
           
           public void remove(String cegazonosito) {
                   super.remove(find(cegazonosito));
           }
           
           @SuppressWarnings("unchecked")
           @Override
           public Collection<Szolgaltato> findAll() {
                   return  (Collection<Szolgaltato>)em.createQuery("select sz from 
   Szolgaltato sz").getResultList();
           }
           
           // Kiegészítés, hogy az árusításokat is kezelje
           
           public void elad(Szolgaltato sz, Mobiltelefon m) {
                   sz.addMobiltelefon(m);
           }
           
           public Collection<Mobiltelefon> eladottTelefonok(Szolgaltato sz) {
                   return  sz.getMobiltelefonok();
           }
           
           publicboolean isTelefonEladott(Mobiltelefon m) {
                   for (Szolgaltato sz : findAll() ) {
                           if (sz.getMobiltelefonok().contains(m))
                                   return true;
                   }
                   return false;
           }
   }

2.8.2.5. Műveletek végrehajtása, entity-k, kezelők akalmazása

2.8.2.5.1. Vigyen fel egy új vevőt!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   
                   Vevo v = new Vevo();
                   v.setUgyfelszam(987654322);
                   v.setNev("JPA_XYZ");
                   v.setE_mail("JPAvevo@jpa.hu");
                   v.setIrsz(9999);
                   v.setVaros("Város1");
                   v.setUtca("Utca1");
                   v.setHsz(99);
                   
                   em.getTransaction().begin();
                   vk.insert(v);
                   em.getTransaction().commit();
           }
   }
2.8.2.5.2. Vigyen fel egy új szolgáltatót!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   
                   em.getTransaction().begin();
                   szk.insert("987651234","Cég99",8888,"Város2","Utca2",88);
                   em.getTransaction().commit();
           }
   }
2.8.2.5.3. Kapcsolja össze a vevőt a szolgáltatóval (elégedettség kapcsolat)!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Vevo v = vk.find(987654322);
                   Szolgaltato sz = szk.find("987651234");
                   v.addSzolgaltato(sz);
                   em.getTransaction().begin();
                   vk.update(v);
                   em.getTransaction().commit();
           }
   }
2.8.2.5.4. Módosítson egy vevőt!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   Vevo v = vk.find(11223344);
                   v.setVaros("Új-város");
                   v.setE_mail("újmail@jpa.hu");
                   em.getTransaction().begin();
                   vk.update(v);
                   em.getTransaction().commit();
           }
   }
2.8.2.5.5. Módosítson egy szolgáltatót!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Szolgaltato sz = szk.find("987651234");
                   sz.setIrsz(1234);
                   sz.setUtca("Újutca");
                   sz.setVaros("Város-11");
                   em.getTransaction().begin();
                   szk.update(sz);
                   em.getTransaction().commit();
           }
   }
2.8.2.5.6. Töröljön egy vevőt!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   Vevo v = vk.find(11223344);
                   em.getTransaction().begin();
                   vk.remove(v);
                   em.getTransaction().commit();
           }
   }
2.8.2.5.7. Töröljön egy szolgáltatót!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Szolgaltato sz = szk.find("987651234");
                   em.getTransaction().begin();
                   szk.remove(sz);
                   em.getTransaction().commit();
           }
   }
2.8.2.5.8. Listázza ki a vevőket!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   Collection<Vevo> vList = vk.findAll();
                   for (Vevo v : vList) {
                           System.out.println(v);
                   }
           }
   }
2.8.2.5.9. Listázza ki a szolgáltatókat!
   public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Collection<Szolgaltato> szList = szk.findAll();
                   for (Szolgaltato sz : szList) {
                           System.out.println(sz);
                   }
           }
   }