Muitos Para Muitos, junto com Outro Muitos para Muitos, como seria a classe?

bom galera,
Estou com um pequeno problema aqui, possuo campo muitos para muitos dentro de outro campo muito para muito.
Não entendeu, vou explicar melhor:

Preciso Guardar as seguintes informações (empresa, Ramo de Atividade e Especialização)

Empresa{ id int, String Nome}
Sendo que uma empresa possui muitos Ramo de Atividade
Ramo de Atividade {id int, String Nome}
Por sua vez um Ramo de Atividade Possui muitas Especializações.
Especializações{id int, String Nome}

Um exemplo desse cadastro seria:

Empresa1: Nova1
Ramo de Atividade: Educacional
Especialização: Consultoria, Direção, Gerencia Escolar

Empresa2: Nova2
Ramo de Atividade: Educacional
Especialização: Gerencia Escolar

Empresa3: Nova3
Ramo de Atividade: Segurança
Especialização: Segurança Patrimonial

Gostaria de saber qual seria a melhor maneira de criar as classes e as tabelas?
Estive Pensando em criar Classes

Empresa{ id, Nome, ArrayList}
RamoAtividade{id,Nome,ArrayList<Especialização>}

Mas não acho que isso seja a melhor forma, pois teriamos problemas para Salvar novas Especializações de um cadastro já existente no banco de dados, não saberiamos oque foi modificado… Seria necessario acessar o banco novamente para pegar o cadastro antigo e fazer as comparações… isso resultaria em um gasto de processamento desnecessario… por isso estou pedindo a ajuda de vocês… o importante é entender a logica do problema… Espero que me ajudem!
Grato, desde já!

Pelo que entendi a Empresa poderia ser ligada direto as Especializações, e estas sim ligadas ao Ramo de Atividade…

Afinal, dizer que a empresa Nova2 é do Ramo Educacional, não garante a ela todas especializações do ramo…

Você pode modar que uma Empresa tem uma lista de Especializações e cada Especialização pertence a um Ramo de Atividade…

Isso varia muito de como for montar a tela…provavelmente seria interessante para o usuário comparar a informação anterior com a nova ao atualizar…

De qualquer forma, vc pode simplesmente apagar todas Especializações abaixo de uma Empresa, e sair inserindo todas novamente…
(isso não funciona se tiver chaves presas a esse relacionamento)

Ola a todos !!
Acredito que a solução será este código abaixo.Criei o relacionamento muitos para muitos e nas tabelas de relacionamento coloquei a UniqueConstraint que não deixa que os relacionamentos se repitam, disparando uma exceção que deve ser tratada na sua regra de negócio.
Segue o código:

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

	@Id
	@GeneratedValue
	@Column(name = "ID")
	private Long id;
	
	@Column(name = "NOME")
	private String nome;

	@ManyToMany
	@JoinTable(name = "EMPRESA_RAMO_ATIVIDADE",
			joinColumns = @JoinColumn(name  = "EMPRESA_ID",referencedColumnName = "ID"),
			inverseJoinColumns = @JoinColumn(name = "RAMO_ATIVIDADE_ID",referencedColumnName = "ID"),
			uniqueConstraints = @UniqueConstraint(columnNames = {"EMPRESA_ID","RAMO_ATIVIDADE_ID"}) )
	private Set<RamoAtividade> ramosAtividades;

//gets e sets
}

@Entity
@Table(name = "RAMO_ATIVIDADE")
public class RamoAtividade implements Serializable {

	@Id
	@GeneratedValue
	@Column(name = "ID")
	private Long id;
	
	@Column(name = "NOME")
	private String nome;

	@ManyToMany(mappedBy = "ramosAtividades")
	private Set<Empresa> empresas;
	
	@ManyToMany
	@JoinTable(name = "RAMO_ATIVIDADE_ESPECIALIZACAO",
			joinColumns = @JoinColumn(name  = "RAMO_ATIVIDADE_ID",referencedColumnName = "ID"),
			inverseJoinColumns = @JoinColumn(name = "ESPECIALIZACAO_ID",referencedColumnName = "ID"),
			uniqueConstraints = @UniqueConstraint(columnNames = {"RAMO_ATIVIDADE_ID","ESPECIALIZACAO_ID"}))
	private Set<Especializacao> especializacoes;

//gets e sets
}

@Entity
@Table(name = "ESPECIALIZACAO")
public class Especializacao implements Serializable {

	@Id
	@GeneratedValue
	@Column(name = "ID")
	private Long id;
	
	@Column(name = "NOME")
	private String nome;

	@ManyToMany(mappedBy = "especializacoes")
	private Set<RamoAtividade> ramosAtividades;
//gets e sets
}

[quote=Lord]Ola a todos !!
Acredito que a solução será este código abaixo.Criei o relacionamento muitos para muitos e nas tabelas de relacionamento coloquei a UniqueConstraint que não deixa que os relacionamentos se repitam, disparando uma exceção que deve ser tratada na sua regra de negócio.
Segue o código:

[/quote]

Olá Amigo, eu testei o seu metodo no hibernate apesar de estar utilizando DAO… para ver como ficaria e percebi que o seu conjunto de soluções Não possibilita as Empresas terem Especializações diferentes das que são Proprias do Ramo de Atividade.

A empresa tem que poder escolher qual ramo de atividade ela quer, entende? no caso eu não quero pegar todas as especializações do Ramo Atividade.

Empresa tem uma lista de Ramo Atividade, e a empresa pode escolher um ou + especializações para esse Ramo de Atividade…

Muito Obrigado pela resposta… vou pensar como posso melhorar isso…
Se vc souber como posta ai
vlw

Isso Parace legal… mas parece meio um ciclo vicioso… pq depois do Ramo de Atividade nós temos uma lista de Especializações novamente… podemos nos confundir né!!!
Será que nós nesse caso nao poderiamos colocar na especialização apenas o atributo ID do RamoAtividade? (assim ao meu ver o ciclo estaria quebrado não tendo uma classe dentro da outra, só não sei se seria legal no OO)

Me parece uma solução interessante, mas isso não geraria um processamento para o banco de dados desnecessário, tendo em vista que poderiamos apenas inserir os novos?

Eu estive pensando em uma tabela no banco para guardar a especialização da empresa da seguinte forma:
{
id, id_empresa,id_especializacao
}
e uma nova classe que seria Especialização_Empresa que teria
{id, Especialização}
Assim eu poderia manipular o objeto destruindo ou construindo o relacionamento no banco de dados a qualquer hora!
O problema é que isso é um POG danado… gostaria de deixar isso no puro conceito OO mas está complicado!
E ai amigos oque me dizem???

abraços, obrigado pela atenção!