public class HibernateDAO implements DAO{
private static final Logger logger = Logger.getLogger(HibernateDAO.class);
protected Class EntidadeClass;
public static boolean persiste = true;
private static Session session = null;
private int i = 0;
/**
* Contrutor específico que gera uma DAO para o tipo de Entidade que será tratada.
*
* @param EntidadeClass Tipo da Classe.
*/
public HibernateDAO(Class EntidadeClass) {
this.EntidadeClass = EntidadeClass;
}
/**
* Contrutor padrão.
*/
public HibernateDAO() {
}
protected final Class getEntidadeClass(){
return EntidadeClass;
}
/**
* Método para inicialização da entidade.
*
* @param entidade Entidade que será inicializada.
* @param initialize String de inicialização.
* @return Entidade - entidade inicializada.
*/
public Entidade initializeSingle(Entidade entidade, String[] initialize) {
try {
Session session = getSession();
session.lock(entidade, LockMode.NONE);
for (int i = 0; i < initialize.length; i++)
{
Hibernate.initialize(PropertyUtils.getProperty(entidade, initialize[i]));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeSession();
}
return entidade;
}
public Entidade initialize(Entidade entidade, String[] initialize) {
try {
Session session = getSession();
session.lock(entidade, LockMode.NONE);
for (int i = 0; i < initialize.length; i++)
{
String init = initialize[i];
Object newEntidade = entidade;
StringTokenizer stringTokenizer = new StringTokenizer(init, ".");
while (stringTokenizer.hasMoreTokens())
{
String s = (String)stringTokenizer.nextElement();
if (newEntidade != null)
{
newEntidade = (Object)PropertyUtils.getProperty(newEntidade, s);
Hibernate.initialize(newEntidade);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeSession();
}
return entidade;
}
public Entidade initializeImp(Entidade entidade, String[] initialize) {
try {
for (int i = 0; i < initialize.length; i++)
{
String init = initialize[i];
int j = 1;
Object newEntidade = entidade;
StringTokenizer stringTokenizer = new StringTokenizer(init, ".");
while (stringTokenizer.hasMoreTokens())
{
String s = (String)stringTokenizer.nextElement();
if (newEntidade != null)
{
if (newEntidade.getClass().getName().equals("org.hibernate.collection.PersistentSet")
&&(!stringTokenizer.hasMoreTokens())
&&(j > 1)){
PersistentSet set = (PersistentSet)newEntidade;
Iterator itera = set.iterator();
while(itera.hasNext()){
newEntidade = (Object)PropertyUtils.getProperty(itera.next(), s);
Hibernate.initialize(newEntidade);
}
}else{
newEntidade = (Object)PropertyUtils.getProperty(newEntidade, s);
Hibernate.initialize(newEntidade);
}
}
j++;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return entidade;
}
public Entidade findByPrimaryKey(Serializable pk) throws PersistenceException {
Session session = getSession();
session.beginTransaction();
Entidade entidade = null;
try {
entidade = (Entidade) session.get(getEntidadeClass(), pk);
if (entidade == null) {
entidade = initialize(entidade, null);
}
} catch (HibernateException e) {
logger.error(e);
throw new PersistenceException(e);
} finally {
session.flush();
session.clear();
session.close();
closeSession();
}
return entidade;
}
public Entidade findFirst(Integer identUC) throws PersistenceException {
Session session = getSession();
Entidade entidade = null;
try {
StringBuffer queryStr = new StringBuffer("from ").append(getEntidadeClass().getName());
Query query = session.createQuery(queryStr.toString()).setFirstResult(0).setMaxResults(1);
entidade = (Entidade) query.uniqueResult();
} catch (HibernateException e) {
logger.error(e);
throw new PersistenceException(e);
} finally {
closeSession();
}
return entidade;
}
public void saveOrUpdate(Entidade obj) throws PersistenceException{
Session session = getSession();
try{
session.saveOrUpdate(obj);
session.flush();
}catch(HibernateException e){
logger.error(e);
throw new PersistenceException(e);
}finally{
closeSession();
}
}
public Serializable insert(Entidade obj) throws PersistenceException {
Session session = getSession();
Serializable pk = null;
try {
pk = session.save(obj);
session.flush();
if (persiste) session.beginTransaction().commit();
} catch (HibernateException e) {
logger.error(e);
throw new PersistenceException(e);
} finally {
closeSession();
}
return pk;
}
public void update(Entidade obj) throws BatchUpdateException, PersistenceException {
Session session = getSession();
try {
session.update(obj);
session.flush();
session.beginTransaction().commit();
System.err.println("COMMIT");
}catch (GenericJDBCException k){
throw new BatchUpdateException(k.getCause().getMessage(), null);
}catch (HibernateException e) {
logger.error(e);
throw new PersistenceException(e);
}finally {
closeSession();
}
}
public void delete(Entidade obj) throws ConstraintViolationException, PersistenceException {
Session session = getSession();
try {
session.delete(obj);
session.flush();
if (persiste) session.beginTransaction().commit();
}catch (ConstraintViolationException h){
throw new ConstraintViolationException("Não foi possível excluir o "+ obj.getClass().getName() +". Existem informações associadas", null, null);
}
catch (HibernateException e) {
logger.error(e);
throw new PersistenceException(e);
} finally {
closeSession();
}
}
public Collection findAll() throws PersistenceException{
Session session = getSession();
//session.beginTransaction();
try {
StringBuffer queryStr = new StringBuffer("from ").append(getEntidadeClass().getName());
System.out.println(queryStr.toString());
Query query = session.createQuery(queryStr.toString());
return query.list();
} catch (HibernateException e) {
logger.error(e);
throw new PersistenceException(e);
} finally {
session.close();
closeSession();
}
}
protected Collection findAll(Order[] orderBy) throws PersistenceException {
Session session = getSession();
try {
Criteria criteria = session.createCriteria(getEntidadeClass());
if (orderBy != null) {
for (int i = 0; i < orderBy.length; i++) {
criteria.addOrder(orderBy[i]);
}
}
criteria.setCacheable(true);
return criteria.list();
} catch (HibernateException e) {
logger.error(e);
throw new PersistenceException(e);
}finally{
closeSession();
}
}
public Session getSession(){
System.out.println("conexão:" + ++i);
System.out.println(this.toString());
return HibernateDAO.session = HibernateUtil.getSession();
//tx = session.beginTransaction();
}
protected Logger getLogger() {
return HibernateDAO.logger;
}
protected void closeSession() {
if (persiste)
HibernateUtil.getSession().close();
}
/* protected void commitTransaction(){
HibernateUtil.commitTransaction();
}
*/
/**
* Retorna uma Colecao de acordo com uma query HQL usando parametros
* associados de forma posicional. Os bindings sao realizados pelo array de
* objects passado, e um tamanho maximo especificado
*
* @param hql
* @param parameters
* @param maxResults
* @return
*/
public List findByQuery(String hql, Object[] parameters, int maxResults) {
Session session = getSession();
List results = null;
try {
Query query = session.createQuery(hql);
if (parameters != null) {
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i, parameters[i]);
}
}
query.setMaxResults(maxResults);
results = query.list();
} catch (HibernateException e) {
logger.error(e);
throw new RuntimeException(e);
} finally {
closeSession();
}
return results;
}
/**
* Retorna uma Colecao de acordo com uma query HQL usando parametros
* associados de forma posicional. Os bindings sao realizados pelo array de
* objects passado, e um tamanho maximo especificado
*
* @param hql
* @param parameters
* @param maxResults
* @param initialize
* @return
*/
public List findByQueryImp(String sql, Object[] parameters, String[] initialize) {
Session session = getSession();
Collection result = null;
try {
Query query = session.createSQLQuery(sql).addEntity(getEntidadeClass());
if (parameters != null) {
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i, parameters[i]);
}
}
result = query.list();
if (initialize != null) {
if (result != null)
{
Iterator itResults = result.iterator();
while (itResults.hasNext()) {
Entidade entidade = (Entidade)itResults.next();
Hibernate.initialize(entidade);
entidade = initializeImp(entidade, initialize);
}
}
}
} catch (HibernateException e) {
logger.error(e);
throw new RuntimeException(e);
} finally {
closeSession();
}
return (List)result;
}
/**
* Retorna uma Colecao de acordo com uma query HQL usando parametros
* associados de forma posicional. Os bindings sao realizados pelo array de
* objects passado, e um tamanho maximo especificado
*
* @param hql
* @param parameters
* @param maxResults
* @return
*/
public synchronized Integer getNexPrimaryKey() {
Session session = getSession();
Integer result = null;
try {
String hql = "select isnull(max(codigo), 0) + 1 from " + getEntidadeClass().getName();
Query query = session.createQuery(hql);
result = (Integer)query.uniqueResult();
} catch (HibernateException e) {
logger.error(e);
throw new RuntimeException(e);
} finally {
closeSession();
}
return result;
}
/**
* Retorna uma Colecao de acordo com uma query HQL usando parametros
* associados de forma posicional. Os bindings sao realizados pelo array de
* objects passado
*
* @param hql
* @param parameters
* @param maxResults
* @return
*/
public Collection findBySqlQuery(String sql, String alias, Object[] parameters) {
return findBySqlQuery(sql, alias, parameters, -1, null);
}
/**
* Retorna uma Colecao de acordo com uma query HQL usando parametros
* associados de forma posicional. Os bindings sao realizados pelo array de
* objects passado
*
* @param hql
* @param parameters
* @param maxResults
* @return
*/
public Collection findBySqlQuery(String sql, String alias, Object[] parameters, String[] initialize) {
return findBySqlQuery(sql, alias, parameters, -1, initialize);
}
/**
* Retorna uma Colecao de acordo com uma query HQL usando parametros
* associados de forma posicional. Os bindings sao realizados pelo array de
* objects passado
*
* @param hql
* @param parameters
* @param maxResults
* @return
*/
public Collection findBySqlQuery(String sql, String alias, Object[] parameters, int maxResults) {
return findBySqlQuery(sql, alias, parameters, maxResults, null);
}
/**
* Retorna uma Colecao de acordo com uma query HQL usando parametros
* associados de forma posicional. Os bindings sao realizados pelo array de
* objects passado, e um tamanho maximo especificado
*
* @param hql
* @param parameters
* @param maxResults
* @return
*/
public Collection findBySqlQuery(String sql, String alias, Object[] parameters, int maxResults, String[] initialize) {
Session session = getSession();
Collection results = null;
try {
Query query = session.createSQLQuery(sql).addEntity(alias, getEntidadeClass());
if (parameters != null) {
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i, parameters[i]);
}
}
if (maxResults != -1)
query.setMaxResults(maxResults);
results = query.list();
if (initialize != null) {
results = initializeCollection(results, initialize);
}
} catch (HibernateException e) {
e.printStackTrace();
logger.error(e);
throw new RuntimeException(e);
} finally {
closeSession();
}
return results;
}
/**
*
*/
public Collection initializeCollection(Collection list, String[] initialize)
{
if (list != null)
{
Iterator itResults = list.iterator();
while (itResults.hasNext()) {
Entidade entidade = (Entidade)itResults.next();
entidade = initialize(entidade, initialize);
}
}
return list;
}
public Collection initializeCollectionImp(Collection list, String[] initialize)
{
if (list != null)
{
Iterator itResults = list.iterator();
while (itResults.hasNext()) {
Entidade entidade = (Entidade)itResults.next();
entidade = initializeImp(entidade, initialize);
}
}
return list;
}
/**
*
* @param entidade
* @param excludeProperty
* @param foreignKey
* @param foreignProperty
* @return List - Lista de entidades que satisfazem o exemplo passado
*/
public List findByExample(Entidade entidade, String[] excludeProperty) {
return findByExample(entidade, excludeProperty, null, null);
}
/**
*
* @param entidade
* @param excludeProperty
* @param initialize
* @return List - Lista de entidades que satisfazem o exemplo passado
*/
public List findByExampleImp(Entidade entidade, String[] excludeProperty, String[] initialize) {
return findByExampleImp(entidade, excludeProperty, null, null, initialize);
}
/**
* Método que procura uma Entidade a partir de um exemplo passado.
*
* @param entidade
* @param excludeProperty
* @param foreignKey
* @param foreignProperty
* @return List - Lista de entidades que satisfazem o exemplo passado
*/
public List findByExample(Entidade entidade, String[] excludeProperty, Entidade[] foreignKey, String[] foreignProperty) {
Criteria crit = getSession().createCriteria(getPersistentClass());
Example example = Example.create(entidade).enableLike(MatchMode.ANYWHERE).ignoreCase();
for (int i=0; excludeProperty != null && i<excludeProperty.length; i++) {
example.excludeProperty(excludeProperty[i]);
}
if (foreignKey != null && foreignProperty != null && foreignKey.length == foreignProperty.length) {
for (int fp=0; fp<foreignProperty.length; fp++) {
crit.add(example).createCriteria(foreignProperty[fp]).add(Example.create(foreignKey[fp]).enableLike(MatchMode.ANYWHERE).ignoreCase());
}
} else crit.add(example);
return crit.list();
}
/**
* Método que procura uma Entidade a partir de um exemplo passado.
*
* @param entidade
* @param excludeProperty
* @param foreignKey
* @param foreignProperty
* @return List - Lista de entidades que satisfazem o exemplo passado
*/
public List findByExampleImp(Entidade entidade, String[] excludeProperty, Entidade[] foreignKey, String[] foreignProperty, String[] initialize) {
Criteria crit = getSession().createCriteria(getPersistentClass());
Example example = Example.create(entidade).enableLike(MatchMode.ANYWHERE).ignoreCase();
Collection result = new ArrayList();
for (int i=0; excludeProperty != null && i<excludeProperty.length; i++) {
example.excludeProperty(excludeProperty[i]);
}
if (foreignKey != null && foreignProperty != null && foreignKey.length == foreignProperty.length) {
for (int fp=0; fp<foreignProperty.length; fp++) {
crit.add(example).createCriteria(foreignProperty[fp]).add(Example.create(foreignKey[fp]).enableLike(MatchMode.ANYWHERE).ignoreCase());
}
} else crit.add(example);
result = crit.list();
if (initialize != null) {
result = initializeCollectionImp(result, initialize);
}
return (List)result;
}
private Class getPersistentClass() {
return EntidadeClass;
}
}
public class Empresas implements java.io.Serializable, Entidade {
// Fields
/**
*
*/
private static final long serialVersionUID = -1197383787512621216L;
private Integer emprId;
private String emprDescricao;
private Character emprSituacao;
private Set filiais = new HashSet(0);
private Set cartoesPostagens = new HashSet(0);
private Set histEmpresas = new HashSet(0);
// Constructors
/** default constructor */
public Empresas() {
}
/** minimal constructor */
public Empresas(Integer emprId, String emprDescricao, Character emprSituacao) {
this.emprId = emprId;
this.emprDescricao = emprDescricao;
this.emprSituacao = emprSituacao;
}
/** full constructor */
public Empresas(Integer emprId, String emprDescricao, Character emprSituacao,
Set Filiaises, Set CartoesPostagems, Set HistEmpresases) {
this.emprId = emprId;
this.emprDescricao = emprDescricao;
this.emprSituacao = emprSituacao;
this.filiais = Filiaises;
this.cartoesPostagens = CartoesPostagems;
this.histEmpresas = HistEmpresases;
}
/**
* @return the cartoesPostagens
*/
public Set getCartoesPostagens() {
return cartoesPostagens;
}
/**
* @param cartoesPostagens the cartoesPostagens to set
*/
public void setCartoesPostagens(Set cartoesPostagens) {
this.cartoesPostagens = cartoesPostagens;
}
/**
* @return the emprDescricao
*/
public String getEmprDescricao() {
return emprDescricao;
}
/**
* @param emprDescricao the emprDescricao to set
*/
public void setEmprDescricao(String emprDescricao) {
this.emprDescricao = emprDescricao;
}
/**
* @return the emprId
*/
public Integer getEmprId() {
return emprId;
}
/**
* @param emprId the emprId to set
*/
public void setEmprId(Integer emprId) {
this.emprId = emprId;
}
/**
* @return the emprSituacao
*/
public Character getEmprSituacao() {
return emprSituacao;
}
/**
* @param emprSituacao the emprSituacao to set
*/
public void setEmprSituacao(Character emprSituacao) {
this.emprSituacao = emprSituacao;
}
/**
* @return the filiais
*/
public Set getFiliais() {
return filiais;
}
/**
* @param filiais the filiais to set
*/
public void setFiliais(Set filiais) {
this.filiais = filiais;
}
/**
* @return the histEmpresas
*/
public Set getHistEmpresas() {
return histEmpresas;
}
/**
* @param histEmpresas the histEmpresas to set
*/
public void setHistEmpresas(Set histEmpresas) {
this.histEmpresas = histEmpresas;
}
// Property accessors
}