Documente Academic
Documente Profesional
Documente Cultură
Cristina Fierbinteanu
2
Cuprins
4 Entit
ati JPA 45
4.1 Clasa corespunzatoare unei tabele . . . . . . . . . . . . . . . . 45
4.2 Fatada componentei de tip entitate . . . . . . . . . . . . . . . 47
i
ii CUPRINS
Anexe 73
A Definirea unei surse de date n GlassFish 73
B Studiu de caz 77
Bibliografie 99
List
a de figuri
iii
iv DE FIGURI
LISTA
Capitolul 1
1
2 CAPITOLUL 1. FUNDAMENTE ALE LIMBAJULUI JAVA
tudent, alocaSala.
Un obiect este o entitate tangibila din lumea reala, creat pe baza sablonului
reprezentat de clasa. Un obiect contine structura(campurile) si comporta-
mentul(metodele) unei clase. Un obiect este o instant a a unei clase.
O clasa abstracta este o clasa care contine cel putin o metoda abstracta,
adica o metoda fara implementare. O clasa abstracta nu poate fi instantiata,
iar subclasele ei trebuie sa implementeze metodele abstracte.
Supranc
arcarea metodelor
Se poate folosi acelasi nume pentru metode diferite ale unei clase, cu conditia
ca listele de argumente ale acestor metode sa fie diferite. Numele unei me-
tode mpreuna cu lista de argumente ale acesteia definesc semn atura unei
metode, care identifica n mod unic metodele unei clase.
Constructori
Atunci cand sunt create instante ale unei clase (obiecte) este apelata n mod
automat o metoda a clasei respective, numita constructor. Un constructor
este o metod a far
a rezultat care are acelasi nume cu numele clasei.
Constructorii pot fi suprancarcati, deci se pot defini mai multi constructori
pentru o clasa, fiecare avand o alta lista de argumente.
Accesul la c
ampurile de date si apelul metodelor
Pentru a folosi un camp al unui obiect se utilizeaza operatorul punct asezat
ntre numele obiectului si numele campului. De exemplu, o1.nume se refera
la campul(atributul) nume al obiectului o1.
Mostenirea este o relatie ntre clase, prin care o clasa declara o alta ca
fiindu-i parinte. Clasa copil(subclasa, clasa derivata) mosteneste toate
proprietatile clasei parinte(superclasei, clasei de baza), adica toate campurile
si metodele acesteia. Subclasa poate defini atribute si metode aditionale si
redefini operatii specificate de catre clasa parinte n cazul n care este nece-
sara o implementare diferita. O clasa poate fi derivata dintr-o singura alta
clasa (cu alte cuvinte o clasa poate avea o singura superclasa), nsa poate
implementa oricate interfete.
class Baza{
String nume;
Baza(){//constructor fara parametri
nume = "Baza";
}
Baza(String n){//constructor
nume = n;
}
void afiseaza(){
System.out.println("Baza");
}
void afiseaza(String sir){
System.out.println(nume+sir);
}
}
class Program{
public static void main(String[] args){
b = d1;
b = d2;
}
}
C:\ProgrameJava>javac Program.java
C:\ProgrameJava>java Program
Baza
Derivata1
6 CAPITOLUL 1. FUNDAMENTE ALE LIMBAJULUI JAVA
Derivata2
Derivata1
Derivata2
java -version
Primul pas n dezvoltarea unui program Java consta n editarea unui fisier
text continand codul programului. Fisierul trebuie sa aiba extensia .java,
de exemplu, numele fisierului ar putea fi PrimulProgram.java. Compilarea
programului se face utilizand comanda javac:
javac PrimulProgram.java
java PrimulProgram
1.4 Pachete
Un grup de clase care servesc unui anumit tip de aplicatie sunt pastrate n
Java n acelasi director si alcatuiesc un pachet. Numele pachetului este un
sir de nume de directoare separate prin puncte, care reprezinta ierarhia de
directoare (calea) pana la subdirectorul n care sunt memorate clasele din
pachet. De exemplu, fisierele din pachetul cu numele programeJava.unu pot
fi memorate n directorul C:\cristina\programeJava\unu, cu conditia ca di-
rectorul C:\cristina sa fie specificat n variabila de mediu CLASSPATH.
package programeJava.unu;
public class Salut {
public static void main(String args[]){
System.out.println("Salut!");}}
Salut.java
C:\cristina>javac programeJava\unu\Salut.java
C:\cristina>java programeJava.unu.Salut
Salut!
sau
Pentru a utiliza ntr-un program o clasa dintr-un alt pachet este necesara
folosirea n program a unei instructiuni import. Prima instructiune import
din exemplul urmator permite utilizarea n program a clasei Salut din pa-
chetul programeJava.unu. Al doilea exemplu ilustreaza o instructiune import
care permite utilizarea n program a tuturor claselor definite n pachetul
programeJava.unu.
import programeJava.unu.Salut;
import programeJava.unu.*;
8 CAPITOLUL 1. FUNDAMENTE ALE LIMBAJULUI JAVA
class Colectii{
studenti.add(1);
Studenti me = new Studenti("Popescu","Cristina",31);
studenti.add(me);
1.6. COLECT
II SI CLASE GENERICE 9
}
}
class Studenti{
String nume;
String prenume;
int varsta;
Colectii.java
C:\ProgrameJava\unu>javac Colectii.java
Note: Colectii.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
10 CAPITOLUL 1. FUNDAMENTE ALE LIMBAJULUI JAVA
C:\ProgrameJava\unu>java Colectii
1
Popescu Cristina
Gogu
import java.util.ArrayList;
class Colectii2{
studenti.add(1);
Studenti me = new Studenti("Popescu","Cristina",31);
studenti.add(me);
String nume = "Gogu";
studenti.add(nume);
}
}
Colectii2.java
1.7. TRATAREA EXCEPT
IILOR 11
C:\ProgrameJava\unu>javac Colectii2.java
Colectii2.java:9: cannot find symbol
symbol : method add(int)
location: class java.util.ArrayList<Studenti>
studenti.add(1);
2 errors
try {
//apeluri de metode
}
catch(ex1) {
//trateaza exceptia ex1
}
catch(ex2) {
//trateaza exceptia ex2
}
.
.
.
finally {
//se executa ntotdeauna
}
12 CAPITOLUL 1. FUNDAMENTE ALE LIMBAJULUI JAVA
Fiecarui bloc try trebuie sa i corespunda cel putin un bloc catch sau un
bloc finally. Un bloc finally contine instructiuni care se executa indiferent
daca apare sau nu o exceptie. Deoarece secventa de program plasata n in-
teriorul unui bloc try poate genera mai multe tipuri de exceptii se pot folosi
blocuri catch multiple, fiecare corespunzand unui anumit tip de eroare. Blo-
curile catch trebuie sa apara imediat dupa blocul try caruia i corespund si
este necesar sa fie plasate unul dupa celalalt.
Interfata Runnable contine o singura metoda, public void run(), prin in-
termediul careia clasa care implementeaza interfata Runnable defineste codul
care va fi rulat de catre firul de executie. Legatura dintre obiectul Runnable
care defineste codul si obiectul Thread care reprezinta firul de executie se
face prin intermediul constructorului clasei Thread, caruia i se transmite ca
parametru obiectul de tip Runnable. Pornirea firului de executie se face prin
apelul metodei start() a clasei Thread.
class FireExecutie {
public static void main(String[] args)
{
FirTipUnu firLent = new FirTipUnu();
FirTipDoi firRapid = new FirTipDoi();
fir1.setPriority(Thread.MIN_PRIORITY);
fir2.setPriority(Thread.MAX_PRIORITY);
fir1.start();
fir2.start(); }}
Cea mai simpla solutie se obtine prin folosirea driverului JDBC nativ,
care este o implementare n Java a protocolului de retea al bazei de date,
traducand cererile JDBC direct n cereri catre baza de date.
Interogarile sunt transmise din program catre sistemul DBMS prin inter-
mediul unui obiect de tip Statement, apeland metoda executeQuery. Rezul-
tatul interogarii este obtinut ntr-o instanta a clasei ResultSet. Operatiile
de tipul INSERT, UPDATE, CREATE TABLE, DROP TABLE sau AL-
TER TABLE, care nu au ca rezultat o multime de nregistrari, se efectueaza
1.9. APLICAT
II CU BAZE DE DATE 17
apeland metoda executeUpdate(), tot prin intermediul unui obiect de tip Sta-
tement.
Java DB
Java DB este o versiune a sistemului Derby(Apache) pentru baze de date.
Aceasta versiune este dezvoltata n ntregime n tehnologie Java si este n
prezent mpachetata n serverul de aplicatii GlassFish.
C:\Sun\SDK\javadb\bin>ij
ij>connect jdbc:derby:student;
create=true; user=profesor;
18 CAPITOLUL 1. FUNDAMENTE ALE LIMBAJULUI JAVA
password = parolaprofesor
as my_connection;
ij>exit;
C:\Sun\SDK\javadb\bin>
try{
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
//incarca driver JDBC pt JavaDB
}
catch(ClassNotFoundException e) {
e.printStackTrace();
System.out.println("Eroare incarcare driver!\n" + e);
1.9. APLICAT
II CU BAZE DE DATE 19
try{
dbConnection=DriverManager.getConnection(dbUrl);
Statement stmt= dbConnection.createStatement();
ResultSet rs =
stmt.executeQuery(
" SELECT * FROM student");
while (rs.next()) {
System.out.println (
rs.getString ("nume") + "," +
rs.getString ("prenume") + "," +
rs.getString ("email"));
}
stmt.close();
}
catch(SQLException e) {
e.printStackTrace();
}
finally{rs.close();dbConnection.close();}
}
}
O aplicatie client-server
21
22 CAPITOLUL 2. ARHITECTURA APLICAT
IILOR JAVA EE
package firstBean;
import javax.ejb.Remote;
@Remote
public interface Salut{
public String saluta(String nume);
}
Salut.java
package firstBean;
import javax.ejb.*;
@Stateless
public class SalutEJB implements Salut{
1
Adnotarile(annotations) reprezint a o modalitate de a marca anumite elemente ale
programelor Java cu scopul de a controla executia unei aplicatii. Le puteti privi ca fiind
comentarii disponibile n momentul executiei, destinate masinii virtuale Java. Din punct de
vedere sintactic, o adnotare este un nume, care reprezinta n general tipul unei componente
(de exemplu Stateful, Stateless, Resource, Table, Column, etc.), prefixat cu simbolul @ si
care se scrie naintea modificatorilor de acces care preced declaratiile claselor.
2.3. UN EXEMPLU DE PROGRAMARE PE PLATFORMA JAVA EE 25
SalutEJB.java
package firstBeanClient;
import firstBean.Salut;
import javax.naming.InitialContext;
C:\EJB>javac -d . firstBeanClient/*.java
3. Se mpacheteaza clasa si interfata corespunzatoare componentei de tip
sesiune n arhiva FirstBeanJar.jar.
C:\EJB>jar cvf FirstBeanJar.jar firstBean\
4. Se ncarca arhiva FirstBeanJar.jar pe serverul de aplicatii, folosind, de
exemplu, consola grafica de administrare (Figura 2.2).
5. Se executa programul client.
C:\EJB>java -classpath ->
->C:\glassfishv3\glassfish\lib\appserv-rt.jar; ->
->C:\glassfishv3\glassfish\lib\javaee.jar; ->
C:\EJB firstBeanClient.FirstBeanClient Cristina
begin
modifica nota
recalculeaza media
refa clasamentul
commit
O pagin
a JSP simpl
a
<%@page import="student.AfiseazaStudent"%>
<html>
<head>
<title>Prima pagina JSP</title>
</head>
<body>
<%
javax.naming.InitialContext ctx =
new javax.naming.InitialContext();
AfiseazaStudent beanInstance = (AfiseazaStudent)
ctx.lookup(AfiseazaStudent.class.getName());
String result = beanInstance.afiseaza(777);
%>
<%= result %>
</body>
</html>
student.jsp
directive
declaratii, expresii, cod Java (tag-uri)
2.5. INCLUDEREA COMPONENTELOR IN DOCUMENTE WEB 31
Module Web
Un modul web al unei aplicatii de tip Enterprise este mpachetat ntr-o ar-
hiva Java cu extensia war. Structura generala a unei arhive WAR este
ilustrata n Figura 2.4. Daca modulul web contine numai pagini JSP si pa-
gini statice fisierul de configurare (deployment descriptor) web.xml nu este
necesar. Acesta este folosit doar n cazul tehnologiei JavaServer Faces, pen-
tru specificarea unor informatii de securitate sau daca se doreste modificarea
unor configurari realizate prin adnotari la nivelul componentelor web.
33
34 CAPITOLUL 3. COMPONENTE DE TIP SESIUNE
cosului de cumparaturi). Altfel spus, serverul trebuie sa-i aloce unui cli-
ent aceeasi instanta a clasei care implementeaza cosul de cumparaturi, de
fiecare data cand clientul apeleaza metoda adaugaInCos. Astfel, imple-
mentarea se face printr-o componenta de tip sesiune cu stare. (Imaginati-va
un cumparator ntr-un supermarket, care ar pune articolele pe care le ia de
pe rafturi, de fiecare data n alt cos! Acest scenariu ar corespunde n Java
EE folosirii componentelor fara stare.) Prin contrast, verificarea validitatii
unui card de credit, de exemplu, nu presupune alocarea aceleiasi instante a
unei componente de tip sesiune unui client care solicita aceasta operatie n
mod repetat. Verificarea validitatii unui card de credit se poate implementa
prinr-o componenta de tip sesiune fara stare.
Vom defini o componenta de tip sesiune, fara stare, care contine o metoda
cu numele afiseaza. Metoda are un singur parametru, de tip numar ntreg,
A
3.1. COMPONENTE DE TIP SESIUNE, FAR STARE 35
Definitia interfetei
package student;
import javax.ejb.Remote;
@Remote
public interface AfiseazaStudent{
public String afiseaza(int sid);
}
AfiseazaStudent.java
Definitia clasei
package student;
import java.sql.*;
36 CAPITOLUL 3. COMPONENTE DE TIP SESIUNE
import javax.ejb.*;
import javax.annotation.Resource;
@Stateless(name="AfiseazaStudent")
public class AfiseazaStudentBean implements AfiseazaStudent{
@Resource(name="jdbc/student")
private javax.sql.DataSource ds;
AfiseazaStudentBean.java
import student.AfiseazaStudent;
import javax.naming.InitialContext;
C:\EJB>java -classpath
C:\glassfishv3\glassfish\lib\appserv-
rt.jar;C:\glassfishv3\glassfish\lib\javaee.jar;.
clienti.StudentClient 777
Apr 19, 2010 2:17:29 PM
com.sun.enterprise.transaction.JavaEETransactionManagerSimplified
initDelegates
INFO: Using
com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate
as the delegate
Bond,James,jbon@mycomp.com
Definitia interfetei
package examen;
import javax.ejb.Remote;
@Remote
public interface ExamenOnline{
public String afiseazaIntrebare();
}
ExamenOnline.java
Definitia clasei
package examen;
import javax.ejb.*;
@Stateful
public class ExamenOnlineBean implements ExamenOnline{
ExamenOnlineBean.java
import examen.ExamenOnline;
40 CAPITOLUL 3. COMPONENTE DE TIP SESIUNE
import javax.naming.InitialContext;
ExamenOnlineClient.java
package single;
import javax.ejb.Remote;
@Remote
public interface Contor{
public int citesteContor();
}
Contor.java
package single;
import javax.ejb.Singleton;
@Singleton(name="Contor")
public class ContorBean implements Contor{
private int numara = 0;
public int citesteContor(){
return numara++;
}
}
ContorBean.java
42 CAPITOLUL 3. COMPONENTE DE TIP SESIUNE
package clienti;
import single.Contor;
import javax.naming.InitialContext;
SingleClient.java
C:\EJB>set CLASSPATH=.;C:\glassfishv3\glassfish\lib\javaee.jar
C:\EJB>javac -d single/*.java
C:\EJB>javac -d . clienti/SingleClient.java
@Singleton
@DependsOn("A")
public class B {...}
Adnotarile care pot marca una dintre metodele unei componente de tip
sesiune cu stare sunt: @PostConstruct, @PreDestroy, @PrePassivate
si @PostActivate, cu semnificatiile evidente date de numele lor.
Entit
ati JPA
O instanta a unei entitati JPA corespunde unei linii din tabela asociata.
45
46 I JPA
CAPITOLUL 4. ENTITAT
package doi;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import java.io.Serializable;
@Entity
@Table(name="STUDENT")
@Id
@Column(name="STUDENTID", nullable=false)
private int studentId;
@Column(name="NUME")
private String nume;
@Column(name="PRENUME")
private String prenume;
@Column(name="EMAIL")
private String email;
public Student(){
}
Student.java
Definitia interfetei
package doi;
import javax.ejb.Remote;
import doi.Student;
@Remote
public interface CautaStudent{
public String cauta(int id);
}
CautaStudent.java
Definitia clasei
package doi;
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.EntityManager;
II DE PERSISTENT
4.3. DEFINIREA UNITAT A 49
import javax.persistence.EntityManagerFactory;
import doi.Student;
@Stateless(name="CautaStudent")
public class CautaStudentBean implements CautaStudent{
@PersistenceContext(unitName="StudentPersistUnit")
EntityManager em;
CautaStudentBean.java
C:\EJB>set CLASSPATH=.;C:\glassfishv3\glassfish\lib\javaee.jar
C:\EJB>javac -d . doi/Student.java
C:\EJB>javac -d . doi/CautaStudent.java
C:\EJB>javac -d . doi/CautaStudentBean.java
arhivei WAR[1].)
<persistence>
<persistence-unit name="StudentPersistUnit">
<description>
Prima unitate de persistenta.
Administreaza date referitoare la studenti.
</description>
<jta-data-source>jdbc/student</jta-data-source>
<class>doi.Student</class>
</persistence-unit>
</persistence>
persistence.xml
import doi.CautaStudent;
import javax.naming.InitialContext;
import doi.Student;
4.5. UN EXEMPLU DE CLIENT 51
EntityBeanStudentClient.java
C:\EJB>javac -d . clienti/EntityBeanStudentClient.java
->C:\glassfishv3\glassfish\lib\javaee.jar;. ->
->clienti.EntityBeanStudentClient
Apr 21, 2010 5:12:26 PM
com.sun.enterprise.transaction.JavaEETransactionManagerSimplified
initDelegates
INFO: Using
com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate
as the delegate
Hi, Bond!
Figura 4.2: Starile unei entitati JPA pe durata ciclului sau de viata
starea managed.
ger.flush().
Exemplu
ij> CREATE TABLE Grades(
> studentID INTEGER NOT NULL,
> cursID INTEGER NOT NULL,
> semestrul1 INTEGER,
> semestrul2 INTEGER,
> laborator INTEGER,
> CONSTRAINT pk_SidCid PRIMARY KEY(studentID,cursID));
0 rows inserted/updated/deleted
4.7. CHEI PRIMARE COMPUSE 55
...
ij> INSERT INTO Grades VALUES
> (1,1,9,10,10);
1 row inserted/updated/deleted
...
ij> SELECT * FROM Grades;
STUDENTID |CURSID |SEMESTRUL1 |SEMESTRUL2 |LABORATOR
-----------------------------------------------------------
1 |1 |9 |10 |10
2 |1 |8 |7 |8
3 |1 |10 |10 |10
...
28 rows selected
package celeste;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Column;
import javax.persistence.NamedQuery;
import java.io.Serializable;
@Entity
@Table(name="GRADES")
@IdClass(GradesPK.class)
@NamedQuery(name="Grades.forOneStudent",
query="select o from Grades o where o.studentId=:param")
@Id
@Column(name="STUDENTID", nullable=false)
private int studentId;
@Id
@Column(name="CURSID", nullable=false)
56 I JPA
CAPITOLUL 4. ENTITAT
@Column(name="SEMESTRUL1")
private int semestrul1;
@Column(name="SEMESTRUL2")
private int semestrul2;
@Column(name="LABORATOR")
private int laborator;
public Grades(){
}
Grades.java
package celeste;
import java.io.Serializable;
public GradesPK(){
//constructor public fara parametri
}
GradesPK.java
58 I JPA
CAPITOLUL 4. ENTITAT
...
public List<Grades> getGradesforOneStudent(int idStud){
List<Grades> note =
(List<Grades>)em.createNamedQuery("Grades.forOneStudent").
setParameter("param",idStud).getResultList();
return note;
}
...
FatadaCursuriBean.java
while(listIterator2.hasNext()){
Grades linie = (Grades)listIterator2.next();
System.out.print("ID Curs:"+linie.citesteCursId());
System.out.print(" Nota 1:"+linie.citesteSemestrul1());
System.out.print(" Nota 2:"+linie.citesteSemestrul2());
System.out.println(" Nota lab.:"+linie.citesteLaborator());
}
CelesteClient1.java
3 |3
4 |3
4 |1
5 |1
5 |2
5 |3
5 |4
6 |4
7 |1
7 |3
7 |4
18 rows selected
...
@Entity
@Table(name="CURSURI")
...
public class Cursuri implements Serializable{
...
@ManyToMany
@JoinTable(name="STUD_CURS",
joinColumns=
@JoinColumn(name="CURSID",referencedColumnName="CURSID"),
inverseJoinColumns=
@JoinColumn(name="STUDENTID",referencedColumnName="STUDENTID"))
//name=numele coloanei din tabela STUD_CURS (tabela de join)
//referencedColumnName=numele coloanelor din tabelele
//CURSURI, respectiv STUDENTI
private Set<Studenti> studenti;
...
}
4.9. IMPLEMENTAREA RELAT ILE JPA61
IILOR DE MOSTENIRE DINTRE ENTITAT
o destinatie fizica.
Cele trei resurse pot fi create folosind consola grafica de administrare a ser-
verului de aplicatii(Fig.5.2 si fig.5.3).
63
64 CAPITOLUL 5. COMPONENTE BAZATE PE MESAJE
import javax.ejb.MessageDriven;
import javax.jms.MessageListener;
import javax.jms.Message;
import javax.jms.TextMessage;
import java.util.logging.Logger;
@MessageDriven(name="PrimaCBM",mappedName="jms/Queue")
public class PrimaCBM implements MessageListener {
static final Logger registru = Logger.getLogger("PrimaCBM");
public PrimaCBM(){}
BAZATA
5.2. PRIMA COMPONENTA PE MESAJE 65
PrimaCBM.java
import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.MessageProducer;
import javax.jms.TextMessage;
import javax.jms.Message;
import javax.naming.InitialContext;
System.out.println("Hi!");
try {
conexiune = connectionFactory.createConnection();
System.out.println("S-a creat conexiunea");
mesaj.setStringProperty("text","Testez CBM");
expeditor.send(mesaj);
expeditor.close();
sesiune.close();
conexiune.close();
}
catch(Exception e){System.out.println("Exceptie: " + e.toString());}
} // main
} // class
CBMClient.java
71
Anexa A
DatabaseName = C:\Sun\SDK\javaDB\bin\student
User = profesor
Password = parolaprofesor
PortNumber = 1527
ServerName = localhost
73
74 ANEXA A. DEFINIREA UNEI SURSE DE DATE IN GLASSFISH
C:\Sun\SDK\javadb\bin>ij
ij version 10.4
ij> connect jdbc:derby:celeste;
create=true;user=dba;password=paroladba
> as conex1;
ij> CREATE TABLE Studenti(
> studentID INTEGER PRIMARY KEY,
> nume VARCHAR(30),
> prenume VARCHAR(30),
> email VARCHAR(40));
0 rows inserted/updated/deleted
77
78 ANEXA B. STUDIU DE CAZ
0 rows selected
0 rows selected
0 rows selected
0 rows selected
ij>
7 rows selected
> (1,9,10,10);
1 row inserted/updated/deleted
ij> INSERT INTO Note VALUES
> (2,8,7,8);
1 row inserted/updated/deleted
ij> INSERT INTO Note VALUES
> (3,10,10,10);
1 row inserted/updated/deleted
ij> INSERT INTO Note VALUES
> (4,7,6,7);
1 row inserted/updated/deleted
ij> INSERT INTO Note VALUES
> (5,5,5,5);
1 row inserted/updated/deleted
ij> INSERT INTO Note VALUES
> (6,10,9,10);
1 row inserted/updated/deleted
ij> INSERT INTO Note VALUES
> (7,7,5,9);
1 row inserted/updated/deleted
ij> SELECT * FROM Note;
STUDENTID |SEMESTRUL1 |SEMESTRUL2 |LABORATOR
-----------------------------------------------
1 |9 |10 |10
2 |8 |7 |8
3 |10 |10 |10
4 |7 |6 |7
5 |5 |5 |5
6 |10 |9 |10
7 |7 |5 |9
7 rows selected
1 row inserted/updated/deleted
ij> INSERT INTO Profesori VALUES
> (3,Popescu,Paul);
1 row inserted/updated/deleted
ij> SELECT * FROM Profesori;
PROFESORID |NUME |PRENUME
-------------------------------------------------------------------------
1 |Ionescu |Cristina
2 |Teodorescu |Mihai
3 |Popescu |Paul
3 rows selected
5 rows selected
Definirea entit
atilor JPA
Studenti
package celeste;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.OneToOne;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQuery;
import java.io.Serializable;
@Entity
@Table(name="STUDENTI")
@NamedQuery(name="Studenti.note",
query="select o.note from Studenti o " +
"where o.studentId = :param")
@Id
@Column(name="STUDENTID", nullable=false)
private int studentId;
@Column(name="NUME")
private String nume;
@Column(name="PRENUME")
private String prenume;
@Column(name="EMAIL")
83
@OneToOne
@JoinColumn(name="STUDENTID",referencedColumnName="STUDENTID")
private Note note;
public Studenti(){
}
Studenti.java
84 ANEXA B. STUDIU DE CAZ
Cursuri
package celeste;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.NamedQuery;
import javax.persistence.NamedQueries;
import javax.persistence.ManyToOne;
import javax.persistence.ManyToMany;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import java.io.Serializable;
import java.util.List;
@Entity
@Table(name="CURSURI")
/*@NamedQuery(name="Cursuri.numeTitular",
query="select o.profesor from Cursuri o " +
"where o.cursId = :param")
*/
/*
@NamedQuery(name="Cursuri.studentiInscrisi",
query="select o.studenti from Cursuri o " +
"where o.cursId = :param")
*/
@NamedQueries({
@NamedQuery(name="Cursuri.numeTitular",
query="select o.profesor from Cursuri o " +
"where o.cursId = :param"),
@NamedQuery(name="Cursuri.studentiInscrisi",
query="select o.studenti from Cursuri o " +
"where o.cursId = :param")
})
85
@Id
@Column(name="CURSID", nullable=false)
private int cursId;
@Column(name="NUME")
private String nume;
//@Column(name="PROFESORID")
//private String profesorId;
@ManyToOne
@JoinColumn(name="PROFESORID",referencedColumnName="PROFESORID")
private Profesori profesor;
@ManyToMany
@JoinTable(name="STUD_CURS",
joinColumns=
@JoinColumn(name="CURSID",referencedColumnName="CURSID"),
inverseJoinColumns=
@JoinColumn(name="STUDENTID",referencedColumnName="STUDENTID"))
//name=numele coloanei din tabela
//STUD_CURS (tabela de join)
//referencedColumnName=numele coloanelor din tabelele
//CURSURI, respectiv STUDENTI
private List<Studenti> studenti;
public Cursuri(){
}
Cursuri.java
Profesori
package celeste;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import java.io.Serializable;
@Entity
@Table(name="PROFESORI")
@Id
@Column(name="PROFESORID", nullable=false)
private int profesorId;
@Column(name="NUME")
87
@Column(name="PRENUME")
private String prenume;
public Profesori(){
}
Profesori.java
Note
package celeste;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
88 ANEXA B. STUDIU DE CAZ
import javax.persistence.Column;
import java.io.Serializable;
@Entity
@Table(name="NOTE")
@Id
@Column(name="STUDENTID", nullable=false)
private int studentId;
@Column(name="SEMESTRUL1")
private int semestrul1;
@Column(name="SEMESTRUL2")
private int semestrul2;
@Column(name="LABORATOR")
private int laborator;
public Note(){
}
}
public void scrieSemestrul2(int n){
semestrul2=n;
}
public int citesteLaborator(){
return laborator;
}
public void scrieLaborator(int l){
laborator=l;
}
Note.java
package celeste;
import javax.ejb.Remote;
import java.util.List;
@Remote
public interface FatadaCursuri{
FatadaCursuri.java
b. Clasa care implementeaz
a interfata
90 ANEXA B. STUDIU DE CAZ
package celeste;
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import java.util.List;
@Stateless(name="FatadaCursuri")
public class FatadaCursuriBean implements FatadaCursuri{
@PersistenceContext(unitName="CelestePersistUnit")
EntityManager em;
return titular.citesteNume();
("Cursuri.studentiInscrisi").setParameter("param",idCurs).getResultList();
return listaStudenti;
return note;
return note;
}
}
FatadaCursuriBean.java
Compilarea entit
atilor si componentelor fatadei
C:\EJB>set CLASSPATH=.;C:\glassfishv3\glassfish\lib\javaee.jar
C:\EJB>javac -d . celeste/*.java
Definirea unit
atii de persistent
a
<persistence>
<persistence-unit name="CelestePersistUnit">
<description>
Cristinas ELEarning SysTEm.
</description>
<jta-data-source>jdbc/celeste</jta-data-source>
<class>celeste.Studenti</class>
<class>celeste.Cursuri</class>
<class>celeste.Profesori</class>
<class>celeste.Note</class>
<class>celeste.Grades</class>
</persistence-unit>
</persistence>
persistence.xml
92 ANEXA B. STUDIU DE CAZ
Construirea arhivei
C:\EJB>jar cvf CelesteApp.jar celeste/FatadaCursuri.* ->
->celeste/FatadaCursuriBean.* celeste/Studenti.* celeste/Cursuri.* c
eleste/Profesori.* celeste/Note.* META-INF/persistence.xml
added manifest
adding: celeste/FatadaCursuri.class(in = 223) (out= 184)(deflated 17%)
adding: celeste/FatadaCursuri.java(in = 186) (out= 126)(deflated 32%)
adding: celeste/FatadaCursuriBean.class(in = 1062) (out= 584)(deflated 45%)
adding: celeste/FatadaCursuriBean.java(in = 600) (out= 302)(deflated 49%)
adding: celeste/Studenti.class(in = 1219) (out= 596)(deflated 51%)
adding: celeste/Studenti.java(in = 920) (out= 335)(deflated 63%)
adding: celeste/Cursuri.class(in = 1352) (out= 704)(deflated 47%)
adding: celeste/Cursuri.java(in = 1121) (out= 439)(deflated 60%)
adding: celeste/Profesori.class(in = 1056) (out= 549)(deflated 48%)
adding: celeste/Profesori.java(in = 784) (out= 303)(deflated 61%)
adding: celeste/Note.class(in = 1195) (out= 591)(deflated 50%)
adding: celeste/Note.java(in = 957) (out= 343)(deflated 64%)
adding: META-INF/persistence.xml(in = 353) (out= 173)(deflated 50%)
DatabaseName = C:\Sun\SDK\javaDB\bin\celeste
User = dba
Password = paroladba
PortNumber = 1527
ServerName = localhost
93
Exemple de clienti
package clienti;
import celeste.FatadaCursuri;
import javax.naming.InitialContext;
import celeste.Cursuri;
import celeste.Profesori;
import celeste.Studenti;
import celeste.Note;
import celeste.Grades;
import java.util.List;
import java.util.ListIterator;
String myName=beanInstance.cautaTitular(1);
System.out.println("Hi, "
+ myName + "!");
while(listIterator.hasNext())
System.out.println(((Studenti)listIterator.next()).citesteNume());
Note note=beanInstance.cautaNote(1);
while(listIterator2.hasNext()){
Grades linie = (Grades)listIterator2.next();
System.out.print("ID Curs:"+linie.citesteCursId());
System.out.print(" Nota 1:"+linie.citesteSemestrul1());
System.out.print(" Nota 2:"+linie.citesteSemestrul2());
System.out.println(" Nota lab.:"+linie.citesteLaborator());
}
CelesteClient1.java
C:\EJB>javac -d . clienti/CelesteClient1.java
95
[6] ***: jar - The JAR File Tool, Java Tool Tutorials - Herongs Tuto-
rial Notes, http://www.herongyang.com/Java-Tools/jar-The-JAR-File-
Tool.html.
[8] Jim Keogh: Java fara mistere, Ed.Rosetti Educational, Bucuresti, 2006.
[10] Kathy Sierra, Bert Bates: Atac la Java (Head First Java Second Edi-
tion), Ed. Teora USA, 2006.
[11] Richard Monson-Haefel, Bill Burke: Enterprise JavaBeans 3.0, 5th Edi-
tion, OReilly Media, Inc., 2006.
99
100 BIBLIOGRAFIE