У меня есть требование в сервисе SpringBoot JPA, в котором значение первичного ключа столбца должно храниться в другом столбце того же объекта. В приведенном ниже примере rowId
генерируется StringPrefixedLineSequenceIdGenerator
. Какое бы значение оно ни генерировало, мне нужно хранить его в столбце lineId
.
@Entity
@Table(name="CX_LINE")
public class CXLine {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cx_line_seq")
@GenericGenerator(
name = "cx_line_seq",
strategy = "com.tmo.chub.entity.generator.StringPrefixedLineSequenceIdGenerator"/*,
parameters = {@Parameter(name = StringPrefixedLineSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "2-XP-"),
@Parameter(name = StringPrefixedLineSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%04d")}*/)
@Column(name="row_id")
private String rowId;
@Column(name="LINE_ID")
private String lineId;
//getters & setters
}
Проблема в том, что значение @id
не будет доступно мне до repo.save()
. Есть ли способ получить сгенерированное значение из сессии Hibernate или что-то? или можно использовать @GeneratedValue
& @GenericGenerator
для столбцов, отличных от @id
? В настоящее время я делаю 2 сохранения. Я сохраню новый CXline с уникальным значением (поступающим на входе), а затем снова выполню обновление, как показано ниже. Оцените любые материалы здесь.
CXLine existingLine = lineRepo.findByExtLineId(payload.getCustomerProfile().getCustomerId());
if(existingLine !=null){
//do update
}
else{
CXLine newLine = new CXLine();
newLine.setLineId(payload.getCustomerProfile().getCustomerId());
// set other columns
lineRepo.save(newLine);
CXLine lineToUpdateLineId = lineRepo.findByExtLineId(payload.getCustomerProfile().getCustomerId());
lineToUpdateLineId.setLineId(lineToUpdateLineId.getRowId());
lineRepo.save(newLine);
}