Boa noite amigos,
Antes de mais nada, desejo um ótimo 2013 à todos!
Meu problema é o seguinte:
Tenho um sistema legado em pleno funcionamento. Estou desenvolvendo um sistema que usará o mesmo banco que esse primeiro sistema. Fiz os mapeamentos de todas as tabelas. Todas as tabelas desse banco usam uma tabela auxiliar para montar o Id. Vejam a classe abaixo
[code]
@Entity
@Table(name=“tbl_config”)
public class Config implements Serializable, Entidade {
private static final long serialVersionUID = 1L;
@Id
@TableGenerator(name="CONFIG_GENERATOR",table="TBL_SEQUENCES",pkColumnValue="TBL_CONFIG")
@GeneratedValue(strategy=GenerationType.TABLE,generator="CONFIG_GENERATOR")
@Column(name="config_id")
private Long configId;
@Column(name="created_by")
private String createdBy;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="created_date")
private Date createdDate;
@Column(name="modified_by")
private String modifiedBy;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="modified_date")
private Date modifiedDate;
@Column(name="property_name")
private String propertyName;
@Lob
@Column(name="property_value",columnDefinition="TEXT")
private String propertyValue;
//Getters e Setters
}[/code]
O problema é que ao testar, percebi que em alguns testes, ao persistir um objeto dessa classe no banco, era utilizado um Id já existente (gerado pelo sistema legado), causando uma Exception. Como eu poderia impedir isso? Eu imaginava que ao persistir o objeto, seria buscado o último Id salvo no banco, e daí seria incrementado mais um.
Alguém poderia me ajudar nesse problema?
Um fraterno abraço!
Não sei se funcionaria, mas tente colocar a seguinte configuração na anotação @TableGenerator -> allocationSize = 0
Caso com 0 dê erro, tente com 1.
Essa configuração determina o tamanho de número a serem alocados na memória pelo JPA.
Talvez com 0 ele não armazene nada e sempre adicione +1 para vc. [=
Obrigado hein Hebert, mas não deu certo.
Talvez seja interessante dizer que o sistema legado começa a persistir objetos com ID 1001. Quando minha aplicação começa, inicia com id 300, daí de um em um, ele chega no 1001, lançando a exception. Nunca utilizei essa forma de geração de Id, daí estou meio perdido. rs.
Teria como forçar uma consulta para recuperar o último Id, ou estou falando asneira?
[quote=prog.tiago]Obrigado hein Hebert, mas não deu certo.
Talvez seja interessante dizer que o sistema legado começa a persistir objetos com ID 1001. Quando minha aplicação começa, inicia com id 300, daí de um em um, ele chega no 1001, lançando a exception. Nunca utilizei essa forma de geração de Id, daí estou meio perdido. rs.
Teria como forçar uma consulta para recuperar o último Id, ou estou falando asneira?[/quote]O que eu não entendo é o seguinte. Ambos não estão utilizando a mesma tabela de geração? Eles não deveriam começar do mesmo valor dessa tabela secundária?
Esse nó também não estou compreendendo.
Veja um exemplo:
A tabela User:
Tem os Id’s: 1001,1002,1003,1004 persistidos. No entanto, na tabela TBL_SEQUENCES, coluna SEQUENCE_NEXT_HI_VALUE temos o valor 2. Não deveria ser 1004, informando o valor do id do último registro?
Bem, sem ver fica dificil. Mas será que a app legada não faz uma varredura nos id’s disponíveis e aloca o próximo id a um desta lista.
Exemplo: já existiam os id’s de 1 a 1003. Alguem deletou o registro com o id 2. Na próxima inclusão, a app verifica que esse id 2 não e usado e aloca.
Veja na app legada como é feita a atribuição.
Outra coisa, as duas app (a legada e a nova) estão (ou vão) usando (usar) o bco concomitante? Como vc vai cuidar a concorrência?