Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Подмена первичного ключа / 6 сообщений из 6, страница 1 из 1
15.11.2021, 12:35
    #40112043
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена первичного ключа
Имеется таблица в PostgreSql

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table client
(
    id                    uuid                                               not null
        constraint client_pkey
            primary key,
    full_name             varchar(255)                                       not null,
    surname               varchar(255),
    name                  varchar(255),
    created_by            varchar(100),
    created_date          timestamp with time zone default CURRENT_TIMESTAMP not null,
    modified_by           varchar(100),
    modified_date         timestamp with time zone default CURRENT_TIMESTAMP not null,
    version               bigint                   default 0                 not null



И соотвественно entity

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
@Entity
@Table(name = "client")
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EntityListeners(AuditingEntityListener.class)
public class ClientEntity {
  @Id
  @GeneratedValue
  @Column(name = "id")
  private UUID id;

  @Version
  @Column(name = "version", nullable = false)
  private Long version;

  @Column(name = "full_name", nullable = false)
  private String fullName;

  @Column(name = "surname")
  private String surname;

  @Column(name = "name")
  private String name;

  @Column(name = "created_by", updatable = false)
  @CreatedBy
  private String createdBy;

  @Column(name = "created_date", updatable = false, nullable = false)
  @CreatedDate
  private Instant createdDate;

  @Column(name = "modified_by")
  @LastModifiedBy
  private String modifiedBy;

  @Column(name = "modified_date", nullable = false)
  @LastModifiedDate
  private Instant modifiedDate;
}



Когда я сохраняю entiy в БД, почему-то происходит замена ID, можно ли этого избежать?

Код: java
1.
2.
3.
4.
5.
6.
7.
  @Transactional
  public ClientDto saveClient(ClientFilter clientFilter) {
    var clientDto = получение клиента из другой системы...
    var clientEntity = clientConverter.convertDto(clientDto); идет преобразование в entity, проставляю ID из DTO
    clientRepository.save(clientEntity); Тут при сохранении идет подмена ID, БД или Hibarnate меняет?
    return clientConverter.convertEntity(clientEntity, true);
  }
...
Рейтинг: 0 / 0
15.11.2021, 12:56
    #40112051
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена первичного ключа
-=Koba=-,

типа так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
```java
    @Id
    @GeneratedValue(generator = "PREDEFINED_UUID")
    @GenericGenerator(
        name = "PREDEFINED_UUID",
        strategy = "com.tld.PredefinedUUIDGenerator",
    )
    @Column(name = "id")
    private UUID id;
```

ну в а com.tld.PredefinedUUIDGenerator что-то в духе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
```java
public class PredefinedUUIDGenerator extends UUIDGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) {
        if (isIdDefined(object)) {
            return getId(object);
        }
        return super.generate(session, object);
    }
    
}
```

только нет уверенности, что ваш внешний ID нужно писать именно в ID а не в другое поле и оттуда копировать.
...
Рейтинг: 0 / 0
15.11.2021, 13:20
    #40112057
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена первичного ключа
Андрей Панфилов
-=Koba=-,

типа так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
```java
    @Id
    @GeneratedValue(generator = "PREDEFINED_UUID")
    @GenericGenerator(
        name = "PREDEFINED_UUID",
        strategy = "com.tld.PredefinedUUIDGenerator",
    )
    @Column(name = "id")
    private UUID id;
```

ну в а com.tld.PredefinedUUIDGenerator что-то в духе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
```java
public class PredefinedUUIDGenerator extends UUIDGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) {
        if (isIdDefined(object)) {
            return getId(object);
        }
        return super.generate(session, object);
    }
    
}
```

только нет уверенности, что ваш внешний ID нужно писать именно в ID а не в другое поле и оттуда копировать.


Можете немного пояснить последнюю фразу?
...
Рейтинг: 0 / 0
15.11.2021, 13:25
    #40112060
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена первичного ключа
-=Koba=-,
Во внешней системе свои айдишники. В твоей свои.
Добавь доп поле для связи
Id _внешнейСистемы
...
Рейтинг: 0 / 0
15.11.2021, 13:29
    #40112062
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена первичного ключа
PetroNotC Sharp
-=Koba=-,
Во внешней системе свои айдишники. В твоей свои.
Добавь доп поле для связи
Id _внешнейСистемы


Ок решил уточнить правильно ли понял смысл...
благодарю за подсказку
...
Рейтинг: 0 / 0
15.11.2021, 13:33
    #40112065
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена первичного ключа
-=Koba=-
Можете немного пояснить последнюю фразу?


для хибера сущность с идентификатором, отсутствующая в persistent context, считается не новой, а detached, есть еще история с @Version, что когда колонка такая есть и null, то она-таки засчитывается как новая (здесь ваш случай), т.е. если думать как делать правильно (при условии что хотим-таки внешние идентификаторы использовать), то правильно записывать идентификатор в @Transient поле, а в генераторе использовать значение этого поля, в этом случае обмана получается чуть меньше
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Подмена первичного ключа / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]