Problema / dúvida com um dao utilizando hibernate

Eu mapiei meus models:

funcionario:

@Entity(name = "Funcionario")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "tipo", length = 1, discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("F")
@Table(name = "funconario")
public abstract class Funcionario implements Autenticar {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "codFuncionario")
	private String codFuncionario;
	@ManyToOne  
	@JoinColumn(name="departamento_codDepart", referencedColumnName="codDepart",nullable=false)  
	private Departamento departamento;
	private Endereco endereco;
	@Column(name = "matricula")
	private String matricula;
	@Column(name = "nome")
	private String nome;
	@Column(name = "cpf")
	private String cpf;
	@Column(name = "rg")
	private String rg;
	@Column(name = "usuario")
	private String usuario;
	@Column(name = "senha")
	private String senha;
	@Column(name = "dataEntrada")
	private Date dataEntrada; 
	@Column(name = "dataSaida")
	private Date dataSaida;
	@Column(name = "dataNascimento")
	private Date dataNascimento;
	@Column(name = "salario")
	private Double salario;
        //gets and setters

minha classe departamento:

@Entity
@Table(name=“departamento”)
public class Departamento {
@Id
@GeneratedValue
private Integer codDepartamento;
@Column(name=“nome”)
private String nomeDepartamento;

@OneToMany(mappedBy="departamento", cascade= CascadeType.ALL)  
private Set<Funcionario> funcionarios;  

tenho um relacionamento 1:n

criei um main:

		Funcionario funcionario = new Vendedor();
		Departamento departamento = new Departamento();
		funcionario.setNome("Maria");
		funcionario.setCpf("11111111111");
		funcionario.setRg("2222222222");
		funcionario.setMatricula("124");
		funcionario.setDataNascimento(java.sql.Date.valueOf("2005-02-01"));
		funcionario.setDataEntrada(java.sql.Date.valueOf("2005-02-01"));
		funcionario.setSalario(987.00);
		funcionario.setUsuario("xd");
		funcionario.setSenha("xd");
		
		Set<Funcionario> funcionarios = new HashSet<Funcionario>();  
		funcionarios.add(funcionario);  
		funcionarios.add(funcionario);  
		departamento.setNomeDepartamento("teste");

mas estou com dúvida em como vou adicionar esse departamento e esse funcionario com esse departamento utilizando DAO

  public Funcionario save(Funcionario func){  

  }

  public Departamento save(Departamento depart){  

  }

alguém poderia me ajudar?

Como vc mapeou como cascadeAll acredito que não precisa salvar um por um, porém eu prefiro salvar um por um.

public Funcionario save(Funcionario func){  
Departamento departamento = repositoryDepartamento.findById(func.departamento.getId());
func = repository.save(func);
departamento.add(Arrays.asList(func));
repositoryDepartamento Ou serviceDepartamento.save(departamento);
  }

  public Departamento save(Departamento depart){  
repository.save(depart);
  }

no caso eu dou o save no departamento primeiro e depois chamo o save funcionario?
E o que seria esse repository? Não tenho essa classe / metodo.

isso o departamento já tem que existir

1 curtida

repository é como se fosse a dao, faz o seguinte exemplo mais genérico:

public Funcionario save(Funcionario func){  

busca departamento por id func.departamento.getId() aqui você pode obter o id
    func = salvar o funcionario
    departamento.add(Arrays.asList(func)); **aqui vc adiciona ao departamento o funcionario novo com Id novo gerado pelo banco**
 salva o departamento(departamento);
      }

  public Departamento save(Departamento depart){  
chamando metodo de salvar departamento
  }

vc poderia me passar essa classe repository?

seria isso aqui:

public class HibernateUtil {

private static StandardServiceRegistry registry;
private static SessionFactory sessionFactory;

public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
        try {
            // Cria o registro
            //Para saber mais
            //https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/boot/registry/class-use/StandardServiceRegistry.html
            registry = new StandardServiceRegistryBuilder().configure().build();

            // Cria oMetadataSources
            //para saber mais
            //https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/boot/MetadataSources.html
            MetadataSources sources = new MetadataSources(registry);

            // Create Metadata
            //para saber mais
            //https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/boot/Metadata.html
            Metadata metadata = sources.getMetadataBuilder().build();

            // Create SessionFactory
            //para saber mais
            //https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/SessionFactory.html
            sessionFactory = metadata.getSessionFactoryBuilder().build();

        } catch (Exception e) {
            e.printStackTrace();
            if (registry != null) {
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    }
    return sessionFactory;
}

public static void fecharConexoes() {
    if (registry != null) {
        StandardServiceRegistryBuilder.destroy(registry);
    }
}

}

e tipo caso eu crie 3 departamentos / 1 /2 /3
como eu vou saber qual desses 3 departamentos vai adicionar no funcionario?

no seu método save agora faz o seguinte.

Session session = null;
Transaction transaction = null;

try{
    Session session = this.session.getSessionFactory().openSession();
        transaction = session.beginTransaction();
          transaction.begin();

aqui faz aquele esquema de orientação a objeto
setando os objetos que você quer

e pra finalizar 
      transaction.commit();

*tudo isso envolvido com bloco try catch

} catch (Exception e) {
      if (transaction != null) {
        transaction.rollback();
      }
      e.printStackTrace();
    } finally {
      if (session != null) {
        session.close();
      }
    }

    HibernateUtil.shutdown();

fiquei um pouco confuso com isso tipo o meu metodo de salvar um departamento:

ficaria assim?

public Departamento save(Departamento depart) {
	Session session = null;
	Transaction transaction = null;
	try {
		session.getSessionFactory().openSession();
		transaction = session.beginTransaction();
		transaction.begin();
		transaction.commit();
	} catch (Exception e) {
		if (transaction != null) {
			transaction.rollback();
		}
		e.printStackTrace();
	} finally {
		if (session != null) {
			session.close();
		}
	}

	HibernateUtil.fecharConexoes();
	return depart;
}

e se tiver como vc me ajudar como ficaria o metodo do funcionario pq eu fiquei um pouco confuso .

entre o begin e o commit vc fará algumas ações, como
session.save(departamento);
procure sobre examples hibernate save, update, find que vc vai achar tudoo!

Todo esse código que vc postou agora é padrão, o que vai mudar é o comando entre o begin e o commit, ele vai definir o que vc vai fazer no banco.

1 curtida

entendi vlw man consegui entender melhor agr

1 curtida

so pode me tirar mais uma duvida man?
o begin e pra dar um select
tem algo parecido com o resultset no hibernate?

Um exemplo tirado deste site
https://www.mkyong.com/hibernate/hibernate-query-examples-hql/
Tem esta forma

Query query = session.createQuery("from Stock where stockCode = :code ");
query.setParameter("code", "7277");
List list = query.list();

E esta forma

           session = HibernateUtil.getSessionFactory().openSession();
            funcionario =  (Funcionario) session.get(Funcionario.class, funcionario_id);
1 curtida