miércoles, mayo 21, 2008

EJB3 development (Primera Parte)

Bueno, continuando con las pequeños howto, ahora vamos a realizar un pequeño ejemplo del uso de EJB3. El ejemplo se basara en algo simple, un modelo de datos de tres tablas relacionales. Pero primero espesaremos viendo que cosa es EJB.

EJB o "Enterprise Java Beans", es una API java para la construcción de aplicaciones empresariales JEE, En palabras simples los EJB son componentes desde el lado del servidor que encapsulan la lógica de negocio de la aplicación. para mas info aca.

Espesaremos creando un proyecto maven, para hacer el modelo de datos :
~$mvn archetype:create -DgroupId=org.app.ejb -DartifactId=ejb-security -DarchetypeArtifactId=maven-archetype-quickstart
~$mvn eclipse:eclipse
Luego creamos un package llamado "model", donde dejaremos todos los entity de nuestro proyecto.

Ahora, agregamos las siguientes dependencias a nuestro proyecto maven :

* ejb-api 3.0
* jsr250-api
* persistence-api

Además de agregar lo siguiente al pom.xml :
<build>
<plugins>
...
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-ejb-plugin</artifactid>
<configuration>
<ejbversion>3.0</ejbversion>
</configuration>
</plugin>
</plugins>
</build>


Dentro del package "model" crearemos tres classes , las cuales se llamaran de la siguiente forma :

* User
* UserLogin
* UserState

Ahora estas classes tendrán las siguiente relación :

User 1-n UserLogin
User 1-1 UserState

Ahora creamos las tres classes y a cada una le ponemos la siguiente annotations. Las classes debieran quedar de la siguiente forma :
...
import javax.persistence.Entity;
...
@Entity
public class User implements Serializable {
...
}

...
import javax.persistence.Entity;
...
@Entity
public class UserLogin implements Serializable {
...
}

...
import javax.persistence.Entity;
...
@Entity
public class UserState implements Serializable {
...
}

Luego en cada classe creamos los siguientes atributos con get y set y estas debieran quedar de la siguiente manera :
...

@Entity
@Table(name = "CA_USER")
public class User implements Serializable {

/**
*
*/
private static final long serialVersionUID = -427916813479074007L;

private Integer _id;

private String _name;

private UserState _stateId;

private Set<userlogin≶ _login;

@Id()
@Column(name = "USER_ID", nullable = false)
public Integer getId() {
return _id;
}

public void setId(Integer id) {
_id = id;
}

@Column(name = "USER_NAME", nullable = false)
public String getName() {
return _name;
}

public void setName(String name) {
_name = name;
}

@OneToOne(optional = false)
@JoinColumn(name = "STATE_ID", unique = true, nullable = false, updatable = false)
public UserState getStateId() {
return _stateId;
}

public void setStateId(UserState stateId) {
_stateId = stateId;
}

@OneToMany
@JoinColumn(name = "LOGIN_ID", unique = true, nullable = false, updatable = false)
public Set<userlogin≶ getLogin() {
return _login;
}

public void setLogin(Set<userlogin≶ login) {
_login = login;
}

}

...

@Entity
@Table(name = "CA_USER_STATE")
public class UserState implements Serializable {

/**
*
*/
private static final long serialVersionUID = -7316954246334750548L;

private Integer _id;
private String _name;
private Set<user≶ _user;

@Id
@Column(name = "STATE_ID", nullable = false)
public Integer getId() {
return _id;
}

public void setId(Integer id) {
_id = id;
}

@Column(name = "STATE_NAME", nullable = false)
public String getName() {
return _name;
}

public void setName(String name) {
_name = name;
}

@ManyToOne(optional = false)
@JoinColumn(name = "STATE_ID", unique = true, nullable = false, updatable = false)
public Set<user&l; ggetUser() {
return _user;
}

public void setUser(Set<user≶ user) {
_user = user;
}

}

...

@Entity
@Table(name = "CA_USER_LOGIN")
public class UserLogin implements Serializable {

/**
*
*/
private static final long serialVersionUID = 4376480932546830177L;

private Integer _id;
private String _login;
private String _password;
private User _user;

@Id
@Column(name = "LOGIN_ID", nullable = false)
public Integer getId() {
return _id;
}

public void setId(Integer id) {
_id = id;
}

@Column(name = "LOGIN_NAME", nullable = false)
public String getLogin() {
return _login;
}

public void setLogin(String login) {
_login = login;
}

@Column(name = "LOGIN_PASSWORD", nullable = false)
public String getPassword() {
return _password;
}

public void setPassword(String password) {
_password = password;
}

@ManyToOne
@JoinColumn(name = "USER_ID", unique = true, nullable = false, updatable = false)
public User getUser() {
return _user;
}

public void setUser(User user) {
_user = user;
}

}
Si observan bien las classes agregue unas anotaciones en los methodos y classe los cuales los voy a explicar ahora :

* @Entity: Define que la classe en un entity
* @Table : Define lo atributos de la tabla
* @Id : Define que un atributo es clave primaria
* @Column : Define loa tributos de la columna de la tabla
* @ManyToOne, @OneToMany, @OneToOne : Define la relacion del atributo
* @JoinColumn : Define la estructura de la relacion

Ahora, ya que tenemos los entitys creados, creamos nuestro archivo de configuración el cual definida nuestro persistencia para poder crear nuestro ejb.

Dentro de la ubicación "src/main/resouces/META-INF, creamos un archivo llamado "persistence.xml", el cual debe ser de la siguiente forma :
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="em" transaction-type="JTA">
<jta-data-source>jdbc/sampleDS</jta-data-source>
<class>org.app.ejb.model.user.User</class>
<class>org.app.ejb.model.user.login.UserLogin</class>
<class>org.app.ejb.model.user.state.UserState</class>

<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
</properties>

</persistence-unit>
</persistence>
Si observan el archvio, en el definimos las classes y la conexion para que estas se conexten.

Con esto ya completamos la primera parte. En la segunda crearemos los ejb para usar estos entitys.

suerte

1 comentario:

Anónimo dijo...

Uuuff... en ocasiones me pregunto si la especificación EJB no es matar moscas a cañonazos; quizás la tendencia no siempre es lo más acertado.
Un saludo y gracias por el apunte