Есть ли способ скопировать столбец @id generateValue в другой столбец той же сущности? - PullRequest
1 голос
/ 17 марта 2020

У меня есть требование в сервисе 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);  
}

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете реализовать ту же функциональность по-другому. Если вы не хотите сохранять один и тот же объект два раза, то сначала сгенерируйте последовательность, используя аннотацию @query с собственным SQL запросом к хранилищу.

пример

@Query(value = "SELECT cx_line_seq.NEXTVAL FROM DUAL", nativeQuery = true)
    public Long getCxLineId();

затем установка значения в столбцы и сохранение их. если вы используете вышеуказанный подход, то вам нужно удалить генератор последовательности из вашего класса Entity

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...