JPA Cidades com Estados

Olá a todos,

Estou enfrentando um dilema, cada um resolve de uma maneira mas até agora nenhum eficiente.
O cenário é o seguinte:
Tenho um cadastro de empresa, onde tenho endereco , cidades e estado.
Empresa --> Endereco --> Estados --> Cidades.
Estou tentando fazer esse relacionamento, lembrando que a tabela cidade e estado são estáticas.

Empresa.java

@Entity
@Table(name = "EMPRESA")
@SuppressWarnings("serial")
public class Empresa implements Serializable {

	/** Id da empresa */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	/** Classe com os parametros do Endereço */
	@OneToOne(optional = true)
	@PrimaryKeyJoinColumn(name = "empresa_idEmpresa", referencedColumnName="idEmpresa")
	private Endereco endereco;

Endereco.java

@Entity
@Table(name = "ENDERECO")
@SuppressWarnings("serial")
public class Endereco implements Serializable {

	/** ID do endereco da empresa, psicologo e usuario */
	@Id
	@Column(name = "ENDERECO_ID")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;

	@OneToOne(mappedBy = "endereco")
	@PrimaryKeyJoinColumn(name = "idEmpresa", referencedColumnName = "empresa_idEmpresa")
	private Empresa empresa;
	
	@OneToOne(mappedBy = "endereco")
	@PrimaryKeyJoinColumn(name = "idEstado", referencedColumnName = "estado_idEstado")
	private Estado estado;

Estado.java

@SuppressWarnings("serial")
@Embeddable
@Table(name = "ESTADO")
public class Estado implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	@ManyToOne
	private Cidade cidade;
	
	/** Classe com os parametros do Endereço */
	@OneToOne(optional = true)
	@PrimaryKeyJoinColumn(name = "estado_idEstado", referencedColumnName="idEstado")
	private Endereco endereco;

Cidade.java

@Embeddable
@Table(name = "CIDADE")
@SuppressWarnings("serial")
public class Cidade implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	@OneToMany(mappedBy = "cidade")
	private List<Estado> estados;

AGRADEÇO DESDE JÁ TODAS AS AJUDAS.

Muito Obrigado

Não sei qual é a sua dúvida,

Porém o relacionamento certo ai seria: Empresa -> Endereço -> Cidades -> Estados.

Assim sendo, o Endereço faz um relacionamento OneToMany com Cidades, assim como Cidades faz um OneToMany com Estados.

Isso esclarece a sua dúvida?

Jair,

  Só pra confirmar, vai ficar assim.

Empresa one-to-one Endereco --> Endereco one-to-many Cidades --> Cidades one-to-many Estados

Correto?

Muito obrigado

Isso ai!!

Jair,

Muito obrigado pela ajuda.

Como voce tem mais conhecimentos, gostaria se saber, como ficaria minha servlet, sendo que Cidade e Estado sao tabelas estáticas.

Muito obrigado pela ajuda.

Douglas Luciano

Minha Servlet Empresa.

@SuppressWarnings("serial")
public class EmpresaServlet extends HttpServlet {

	@SuppressWarnings("unchecked")
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Recupera o contexto da aplicação spring.
		WebApplicationContext context = WebApplicationContextUtils
				.getWebApplicationContext(getServletContext());

		//Objeto
		Estado estado = new Estado();
		estado.setNome(request.getParameter("estado"));
		
		//Objeto
		Cidade cidade = new Cidade();
		cidade.setNome(request.getParameter("cidade"));
		
		
		// Objeto Endereco
		Endereco endereco = new Endereco();
		endereco.setLogradouro(request.getParameter("logradouro"));
		endereco.setBairro(request.getParameter("bairro"));
		endereco.setCep(request.getParameter("cep"));


		// Objeto Telefone
		Telefone telefone = new Telefone();
		telefone.setDddTel(Integer.parseInt(request.getParameter("dddTel").toString()));
		telefone.setTel(request.getParameter("tel").toString());

		// Recupera o manager de empresa para inclusão ou atualização.
		GenericManager<Empresa, Long> empresaManager = (GenericManager<Empresa, Long>) context
				.getBean("empresaManager");

		Empresa empresa = new Empresa();
		empresa.setRazaoSocial(request.getParameter("razaoSocial"));
		String fotmatedValue = (request.getParameter("cnpj"));  
		empresa.setCnpj(fotmatedValue);
		empresa.setInscricaoEstadual(request.getParameter("inscricaoEstadual"));
		if(empresa.getInscricaoEstadual() == null){
			empresa.setInscricaoEstadual("ISENTO");
		}
		empresa.setIsento(Boolean.parseBoolean(request.getParameter("isento"))); 
		empresa.setEndereco(endereco);
		empresa.setTelefone(telefone);

		// ... Preenche e valida...
		ClassValidator empresaValidator = new ClassValidator(Empresa.class,
				ResourceBundle.getBundle("psiconlineMessages", Locale.ENGLISH));
		InvalidValue[] invalidValues = empresaValidator
				.getInvalidValues(empresa);

		if (invalidValues.length == 0) {
			// Se tiver ok, salva.
			try {
				empresaManager.save(empresa);
			} catch (Exception e) {
				request.setAttribute("erros", Collections
						.singletonList("Sistema indisponível"));
				e.printStackTrace();
			}

			request.getRequestDispatcher("cadastraEmpresaSucesso.jsp").forward(request, response);
		} else {
			List<String> erros = new ArrayList<String>();
			for (InvalidValue invalidValue : invalidValues) {
				erros.add(invalidValue.getMessage());
			}

			request.setAttribute("erros", erros);
			request.getRequestDispatcher("index.html").forward(request, response);

		}
	}

}