Q1.: ¿Cuál es la diferencia entre la secuencia de la aplicación de identificación en una base de datos utilizando¿Cuál es la diferencia entre: ID de secuencia usando JPA @TableGenerator, @GeneratedValue vs base de datos Auto_Increment
A.
CREATE TABLE Person
(
id long NOT NULL AUTO_INCREMENT
...
PRIMARY KEY (id)
)
frente
B.
@Entity
public class Person {
@Id
@TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ")
@GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
private long id;
...
}
Mi sistema es altamente concurrente. Dado que mi base de datos es un servidor Microsoft SQL, no creo que sea compatible con @SequenceGenerator
, por lo que tengo que quedarme con @TableGenerator
, que es propenso a problemas de concurrencia.
Q2. Este enlace aquí (http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing) sugiere que B podría sufrir problemas de simultaneidad, pero no entiendo la solución propuesta. Le agradecería enormemente si alguien pudiera explicarme cómo evitar problemas de concurrencia con B. Aquí hay un fragmento de su solución:
If a large sequence pre-allocation size is used this becomes less of an issue, because the sequence table is rarely accessed.
Q2.1: ¿Cuánto tamaño de asignación estamos hablando aquí? ¿Debo hacer allocationSize=10
o allocationSize=100
?
Some JPA providers use a separate (non-JTA) connection to allocate the sequence ids in, avoiding or limiting this issue. In this case, if you use a JTA data-source connection, it is important to also include a non-JTA data-source connection in your persistence.xml.
Q2.2: Consumo EclipseLink como el profesional; ¿Tengo que hacer lo que sugiere arriba?
Q3. Si B sufre problemas de simultaneidad, ¿A sufre lo mismo?
Cuando dijo: 'El desafío es transferir esta característica para ser utilizada por JPA'., ¿Se refiere al uso de' @ GeneratedValue'? Así que intento establecer la columna en la tabla 'AUTO_INCREMENT', luego intento crear múltiplos' Persona'. La primera persona crea correctamente con el inicio de 'id' para que sea 5, pero genera una excepción para la persona 2. 'Clave primaria nula o cero encontrada en la unidad de clon de trabajo '. ¿No podemos simplemente anotar la identificación con '@ Id', sin' @ GeneratedValue', luego persistir el objeto de la entidad y dejar que la base de datos con 'PK AUTO_INCREMENT' se encargue de ello? –
¿Puedes mostrar tu mapeo? Debería usar '@ GeneratedValue' para indicar a la implementación de JPA que se trata la ID. Aquí hay un enlace para ayudarle a ponerse en marcha: http://www.developerscrappad.com/408/java/java-ee/ejb3-jpa-3-ways-of-generating-primary-key-through-generatedvalue/ –