Тъй като id
полето вече е уникално и се увеличава автоматично, в този случай нямате нужда от съставен идентификатор, за да може вашият обект да изглежда така:
@Id
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "subid")
public int getSubid() {
return subid;
}
Обектът може да бъде извлечен чрез идентификатор с помощта на мениджъра на обекти:
entityManager.find(MyEntity.class, entityId);
или можете да извлечете обекта с помощта на заявка, която приема и двата id
и 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 също има SelectGenerator който може да извлече идентификатора от колона на база данни, което е полезно, когато базата данни генерира идентификатора с помощта на тригер.
За съжаление, не работи със съставни идентификатори, така че вие сте написали свой собствен разширен SelectGenerator
или използвайте един низ id_sub_id
колона, която комбинира id и sub-id в една колона VARCHAR:
'1-0'
'1-1'
'2-0'
'2-1'
Трябва да напишете тригер за база данни, за да актуализирате двете колони, като използвате специфична за базата данни съхранена процедура и да агрегирате двете колони в една VARCHAR. След това картографирате агрегираната колона, като използвате стандартния SelectGenerator
към поле 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;
}