Hibernate DAO

5 respostas
buyapentiumjerk

Olá pessoal,

gostaria que me dessem umas dicas acerca de um programa que estou a implementar em Java. Sou um novato nestas andanças mas muita vontade de aprender.

Tenho uma classe EntityManagerUtil

public class EntityManagerUtil {

	private static EntityManagerFactory ENTITY_MANAGER_FACTORY;

	public static EntityManager getEntityManager() {
		if (ENTITY_MANAGER_FACTORY == null) {
			ENTITY_MANAGER_FACTORY = Persistence
					.createEntityManagerFactory("Entity");
		}
		return ENTITY_MANAGER_FACTORY.createEntityManager();
	}

}

Tenho uma classe Permissions

@Audited
@Entity
@Table(name = "PERMISSIONS")
public class Permissions implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "PERMISSION_ID", unique = true, nullable = false)
	private long permissionId;
	@Column(name = "PERMISSION_NAME", nullable = false, length = 25)
	private String permissionName;
	@Column(name = "PERMISSION_DESCRIPTION", nullable = true, length = 255)
	private String permissionDescription;
	@Column(name = "PERMISSION_ACTIVE", nullable = false, length = 1)
	private Boolean permissionActive;
	@ManyToMany(cascade = CascadeType.ALL, targetEntity = Roles.class, mappedBy = "rolePermissionList")
	@ForeignKey(name = "FK_ROLES_PERMISSIONS")
	private List<Roles> permissionRoleList = new ArrayList<Roles>();

	public Permissions() {
	}

	public Permissions(long permissionId, String permissionName,
			String permissionDescription, Boolean permissionActive,
			List<Roles> permissionRoleList) {
		super();
		this.permissionId = permissionId;
		this.permissionName = permissionName;
		this.permissionDescription = permissionDescription;
		this.permissionActive = permissionActive;
		this.permissionRoleList = permissionRoleList;
	}

	public long getPermissionId() {
		return this.permissionId;
	}

	public void setPermissionId(long permissionId) {
		this.permissionId = permissionId;
	}

	public String getPermissionName() {
		return this.permissionName;
	}

	public void setPermissionName(String permissionName) {
		this.permissionName = permissionName;
	}

	public String getPermissionDescription() {
		return this.permissionDescription;
	}

	public void setPermissionDescription(String permissionDescription) {
		this.permissionDescription = permissionDescription;
	}

	public Boolean getPermissionActive() {
		return this.permissionActive;
	}

	public void setPermissionActive(Boolean permissionActive) {
		this.permissionActive = permissionActive;
	}

	public void setPermissionRoleList(List<Roles> permissionRoleList) {
		this.permissionRoleList = permissionRoleList;
	}

	public List<Roles> getPermissionRoleList() {
		return permissionRoleList;
	}
}

Tenho uma classe GenericDAO

public class GenericDAO<T extends Serializable> {

	private final Session session;
	private final Class<T> persistentClass;

	@SuppressWarnings("unchecked")
	public GenericDAO() {
		this.session = HibernateUtil.getSession();
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	public Session getSession() {
		return session;
	}

	private void closeSession() {
		if (getSession() != null && getSession().isOpen()) {
			getSession().close();
		}
	}

	protected void save(T entity) {
		try {
			getSession().getTransaction().begin();
			getSession().save(entity);
			getSession().getTransaction().commit();
		} catch (Throwable t) {
			getSession().getTransaction().rollback();
			t.printStackTrace();
		} finally {
			closeSession();
		}
	}

	protected void update(T entity) {
		try {
			getSession().getTransaction().begin();
			getSession().update(entity);
			getSession().getTransaction().commit();
		} catch (Throwable t) {
			getSession().getTransaction().rollback();
			t.printStackTrace();
		} finally {
			closeSession();
		}
	}

	protected void delete(T entity) {
		try {
			getSession().getTransaction().begin();
			getSession().delete(entity);
			getSession().getTransaction().commit();
		} catch (Throwable t) {
			getSession().getTransaction().rollback();
			t.printStackTrace();
		} finally {
			closeSession();
		}
	}

	@SuppressWarnings("unchecked")
	protected List<T> findAll() {
		return getSession().createCriteria(persistentClass).list();
	}

	@SuppressWarnings("unchecked")
	protected T findById(long id) {
		return (T) getSession().createCriteria(persistentClass)
				.add(Restrictions.idEq(id)).uniqueResult();
	}
}

Tenho uma classe PermissionsDAO

public class PermissionsDAO extends GenericDAO<Permissions> {
	protected void permissionSave(Permissions permission) {
		save(permission);
	}

	protected void permissionUpdate(Permissions permission) {
		update(permission);
	}

	protected void permissionDelete(long id) {
		Permissions permission = (Permissions) findById(id);
		delete(permission);
	}

	protected ArrayList<Object> getPermissionList() {
		List<Permissions> permissionsList = findAll();
		ArrayList<Object> outputList = new ArrayList<Object>();
		for (Permissions permission : permissionsList) {
			outputList.add(new Object[] {
					permission.getPermissionName().toString(),
					permission.getPermissionDescription().toString(),
					permission.getPermissionActive(),
					permission.getPermissionId() });
		}
		return outputList;
	}
}

E tenho uma classe PermissionsController

public class PermissionsController {

	public void save(String permissionName, String permissionDescription,
			Boolean permissionActive) throws Exception {
		Permissions permission = new Permissions();
		permission.setPermissionName(permissionName);
		permission.setPermissionDescription(permissionDescription);
		permission.setPermissionActive(permissionActive);

		new PermissionsDAO().permissionSave(permission);
	}

	public void update(long permissionId, String permissionName,
			String permissionDescription, Boolean permissionActive)
			throws Exception {
		Permissions permission = new Permissions();
		permission.setPermissionId(permissionId);
		permission.setPermissionName(permissionName);
		permission.setPermissionDescription(permissionDescription);
		permission.setPermissionActive(permissionActive);

		new PermissionsDAO().permissionUpdate(permission);
	}

	public void delete(long permissionId) throws Exception {
		new PermissionsDAO().permissionDelete(permissionId);
	}

	public ArrayList<Object> permissionsList() {
		return new PermissionsDAO().getPermissionList();
	}
}

Estou a implementar uma aplicação MVC com recurso a Hibernate e estou a ter uns problemas na camada de apresentação.
A minha aplicação apresenta os dados inseridos na BD (MySQL) através de uma JTable ao utilizador.
Pretendo que o utilizador possa Adicionar, Editar e Apagar os dados da BD através de botões incluidos na Form.

Código da JTable

private List<Object> permissionsList = new PermissionsController()
			.permissionsList();

... // JTable

		final String[] columns = new String[] { "Permission name",
				"Permission description", "Permission active" };
		final boolean[] editableRows = { false, false, false };

		TableModel tableModel = new CustomTableModel(permissionsList, columns,
				editableRows);

		customUIDataViewerPrimary.getTableDataViewerPrimary().setModel(
				tableModel);
		customUIDataViewerPrimary.getTableDataViewerPrimary().getColumnModel()
				.getColumn(0).setCellRenderer(new CustomTableCellRenderer());
		customUIDataViewerPrimary.getTableDataViewerPrimary().getColumnModel()
				.getColumn(1).setCellRenderer(new CustomTableCellRenderer());
		customUIDataViewerPrimary.getTableDataViewerPrimary().getColumnModel()
				.getColumn(2)
				.setCellRenderer(new CustomCheckBoxTableCellRenderer());
		customUIDataViewerPrimary.getTableDataViewerPrimary().setHighlighters(
				HighlighterFactory.createSimpleStriping());

...


	/**
	 * Actions Example
	 */
	private void add() {
			try {
				permissionController.save(permissionName,
						permissionDescription, permissionActive);
				customTableModel.addRow(new Object[] { permissionName,
						permissionDescription, permissionActive });
			} catch (Exception e) {
				e.printStackTrace();
			}
}

Consigo fazer a apresentação dos dados ao utilizador sem problemas, sendo que o meu problema nisto tudo é que quando apago uma Permissão apago pelo valor permissionId, o mesmo quando edito e quando apago. Agora a questão é que na minha JTable só apresento as columas “Permission Name”, “Permission Description” e “Permission Active”, passo também para a lista que vai levar os valores para o TableModel a columa ID a qual está escondida (não atribuo nenhum cell renderer), para poder saber qual o ID da permissão a ser editada, ou apagada.

Em cima meti as classes que utilizo para criar o DAO, queria de saber se ao invés de utilizar a columa ID escondida para saber o ID da permissão seleccionada pelo utilizador poderia utilizar o Entity Manager para descobrir a Permissão seleccionada pelo utilizador?

Muito obrigado pela vossa atenção,
Abraço António Godinho

5 Respostas

buyapentiumjerk

Alguem pode me dar a sua opinião se faz favor?

Muito agradecido
AG

fernandopaiva

Olha, eu como vc tbm estou comecando a trabalhar com Hibernate…Estou gostando muito.
Antes trabalhava com DAO e codigos SQL na propria aplicacao…Com Hibernate parece q voltei a ter aquele “tesão” por desenvolver, eh muito pratico e facilita muito.

veja o link, ele me ajudou no comeco: http://www.youtube.com/watch?v=6GeOu02mLOc

e aqui tem muita coisa sobre hql: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

t+ e boa sorte !

buyapentiumjerk

muito obrigado pela sua dica Fernando, mas não estou a utilizar HQL nem o Netbeans, uso Eclipse com Criteria.
O meu problema é na apresentação dos dados na JTable quando quero apagar uma entidade ou editar, o que me leva a pensar que o problema estaja no DAO.

Alguem tem mais idéias se faz favor?

R

Teu DAO genérico pode ser melhorado.

Note que vc está repetindo as operações de save, update e delete para a entidade de Permissão quando poderia reaproveitar
as do DAO genérico.

buyapentiumjerk

Olá raf4ever,

sim eu já pensei utilizar o saveOrUpdate em vez de ter um save e um update no DAO Genérico. Quanto ao DAO Permissions utilizo por vir a ter mais entidades as quais poderão necessitar de alguma manipulação, mas compreendo que estaja apenas a utilizar o DAO Genérico (penso que seja acerca de isso que estejas a falar, sugestões são sempre bem recebidas). Quanto ao meu problema de aceder à entidade atrevés da JTable já resolvi, por lapso meu não estava a criar o acesso às entidades no código cliente:

Aqui para a entidade Users:

private void getEntityValues(int selectedEntity) {
		if (selectedEntity <= usersList.size() - 1) {
			UsersPOJO userActual = usersList.get(selectedEntity);
			userId = userActual.getUserId();
			userName = userActual.getUserName();
			userDescription = userActual.getUserDescription();
                 }
	}

e assim já não necessito de utilizar a coluna ID na JTable para saber o ID da entidade seleccionada.

Muito agradeçido pelas vossas respostas.

Muito obrigado,
AG

Criado 11 de junho de 2011
Ultima resposta 13 de jun. de 2011
Respostas 5
Participantes 3