Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Explicar comportamentos no mapeamento de sequência de ID composta incrementada automaticamente com Hibernate


Como o id campo já é único e incrementado automaticamente, você não precisa de um ID composto neste caso para que sua entidade fique assim:
@Id
@Column(name = "id")
public long getId() {
    return id;
}

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

A entidade pode ser buscada por id usando o gerenciador de entidades:
entityManager.find(MyEntity.class, entityId); 

ou você pode buscar a entidade usando uma consulta que leva tanto o id e o subid :
MyEntity myEntity = entityManager.createTypeQuery("select me from MyEntity where id = :id and subid = :subid", MyEntity.class)
    .setParameter("id", entityId) 
    .setParameter("subid", entitySubId) 
    .getSingleResult();

O Hibernate também tem um SelectGenerator que pode buscar o id de uma coluna do banco de dados, o que é útil quando o banco de dados gera o id usando um gatilho.

Infelizmente, ele não funciona com IDs compostos, então você escreveu seu próprio SelectGenerator estendido ou use uma única string id_sub_id coluna que combina o id e o sub-id em uma única coluna VARCHAR:
'1-0'
'1-1'
'2-0'
'2-1' 

Você precisa escrever um gatilho de banco de dados para atualizar as duas colunas usando um procedimento armazenado específico do banco de dados e agregar as duas colunas no VARCHAR. Você então mapeia a coluna agregada usando o padrão SelectGenerator para um campo String:
@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;
}