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;
}