Pergunta

Existe uma maneira de usar Flyweight objetos com a hibernação persistência mapeamento? Meu modelo de dados contém muitos objetos que serão o mesmo. Em vez de ter uma instância separada para cada um desses mesmos objetos que eu gostaria de usar o FLYWEIGHT projeto e fazer referência sempre o mesmo objeto físico. Como conseguir isso em hibernação?

Btw. que todas as JVMs otimizar o uso de cordas de uma maneira tal que, quando a mesma cadeia é usada várias vezes, será sempre a mesma instância física?

Foi útil?

Solução

Depende.

Para readonly valores você pode facilmente implementar uma FLYWEIGHT criando um UserType personalizado que irá retornar objetos de uma piscina em vez de novas instâncias de cada vez.

Para entidades Hibernate é de sane padrão e quer ser consistente em transações e, portanto, não vai entidades share entre as sessões para evitar condições de corrida de seus dados - e eu não acho que isso é o que você quer.

Mas no caso, é (e isso é totalmente não-recomendado sem realmente saber o que está fazendo) você pode implementar Interceptor.getEntity () que se destina a segunda cache nível. Nesse método, você pode retornar uma entidade (mesmo alguns compartilhada por outras sessões) e você vai efetivamente ter uma FLYWEIGHT para as suas entidades.

mas eu recomendo contra esta para a consistência de seus dados -. Muito melhor ter valores flyweight imutáveis ??reais referenciados por entidades que também tentar flyweight as entidades reais

Outras dicas

Sim, você pode implementar o padrão Flyweight com Hibernate.

O FLYWEIGHT é maneira de minimizar o uso de memória por exemplo . A estratégia é compartilhar o máximo de estado entre instâncias flyweight possível. No seu caso, o estado compartilhável é tudo, exceto o identificador de hibernação objeto e algum estado adicional para manter a identidade do objeto .

Cada instância flyweight precisa de sua própria objeto identidade . O estado adicional é a maneira de implementar a identidade de distinguir entre objetos desse Estado ação ordinária.

public boolean equals(Object obj){
  Fly other; [..]//check type
  //null checks ommitted
  return other.myState.equals(myState) && other.commonState.equals(commonState); 
}

Se a identidade do objeto é compartilhado entre instâncias de hibernação iria interpretar todas as instâncias físicas (referências) como a mesma instância. Hibernate usa o método de identidade verificação objeto é igual e sua implementação igual teria que voltar (! a.equals(a) == true) que é ilegal. igual tem que ser reflexivo. Se você quebrar este contrato todas as bibliotecas que dependem do contrato será quebrado (coleções, hibernate, etc.).

Você não pode implementar o método igual usando o objeto de hibernação identificador para distinguir entre objetos. Isto faria com que a identidade do objeto dependente do estado de persistência (persistiu ou transitória).

Uma forma de modelar o estado comum em hibernação é uma associação de um-para-muitos entre objetos de estado compartilhados e objetos flyweight. (Talvez alguém tenha uma idéia de como mapear os dados sem junção de duas tabelas?)

Cordas: Só cordas internalizadas será compartilhado. Esta não é a melhor solução na maioria das vezes. É apropriado para símbolos (nome da classe, nome do método, etc.). As cordas internalizadas nunca pela coleta de lixo e você tem que ter uma instância de String que vai ser lixo coletado new String("..").intern() de qualquer maneira. Ele não vai salvar alocações. Existe apenas a vantagem menor que a cadeia de base não vai sobreviver a uma geração gc ou poderiam ser alocados na pilha (com análise de escape no ponto quente habilitada e aplicável).

que todas as JVMs otimizar o uso de cordas de uma maneira tal que, quando a mesma cadeia é usada várias vezes, será sempre a mesma instância física?

Eu duvido muito disso. No mesmo arquivo de classe, quando definined como:

String s1 = "Yes";
String s2 = "Yes";

você provavelmente vai ter s1 == s1.

Mas se você tiver como:

String x = loadTextFromFile(); // file contains es
StringBuilder b = new StringBuilder();
s2 = b.append("Y").append(x).toString(); // s2 = "Yes"

Eu não acho que o tempo de execução está indo para verificar e comparar todas as cordas carregados o valor de retorno deles construtor.

Assim, sempre comparar objetos com equals (). É um bom conselho de qualquer maneira uma vez que cada boa Igual a Inicia com:

if (this == o) {
    return true;
}

Se seus objetos implementar a igualdade de identidade, Hibernate só terá a instância único associado a essa chave primária. Eu não acredito que é exatamente a mesma idéia como Flyweight, mas o ponto é que você não terá muitas instâncias do mesmo objeto Hibernate.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top