sql >> Base de Datos >  >> RDS >> Mysql

Explicar los comportamientos en el mapeo de secuencias de identificación compuestas incrementadas automáticamente con Hibernate

Desde el id el campo ya es único y se incrementa automáticamente, no necesita una identificación compuesta en este caso para que su entidad se vea así:

@Id
@Column(name = "id")
public long getId() {
    return id;
}

@Column(name = "subid")
public int getSubid() {
    return subid;
}

La entidad se puede recuperar por id usando el administrador de entidades:

entityManager.find(MyEntity.class, entityId); 

o puede buscar la entidad usando una consulta que tome tanto el id y el subid :

MyEntity myEntity = entityManager.createTypeQuery("select me from MyEntity where id = :id and subid = :subid", MyEntity.class)
    .setParameter("id", entityId) 
    .setParameter("subid", entitySubId) 
    .getSingleResult();

Hibernate también tiene un SelectGenerator que puede obtener la identificación de una columna de la base de datos, lo cual es útil cuando la base de datos genera la identificación mediante un disparador.

Desafortunadamente, no funciona con identificaciones compuestas, por lo que usted escribió su propio SelectGenerator extendido. o use una sola cadena id_sub_id columna que combina el id y el sub-id en una sola columna VARCHAR:

'1-0'
'1-1'
'2-0'
'2-1' 

Debe escribir un activador de base de datos para actualizar las dos columnas utilizando un procedimiento almacenado específico de la base de datos y agregar las dos columnas en VARCHAR. Luego mapea la columna agregada usando el estándar SelectGenerator a un campo de cadena:

@Id
@Column(name = "id_sub_id")
@GeneratedValue( strategy = "trigger" )
@GenericGenerator( 
    name="trigger", strategy="org.hibernate.id.SelectGenerator",
    parameters = {
        @Parameter( name="keys", value="id_sub_id" )
    }
)
public String getId() {
    return id;
}