powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Подмена первичного ключа
6 сообщений из 6, страница 1 из 1
Подмена первичного ключа
    #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
Подмена первичного ключа
    #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
Подмена первичного ключа
    #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
Подмена первичного ключа
    #40112060
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,
Во внешней системе свои айдишники. В твоей свои.
Добавь доп поле для связи
Id _внешнейСистемы
...
Рейтинг: 0 / 0
Подмена первичного ключа
    #40112062
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
-=Koba=-,
Во внешней системе свои айдишники. В твоей свои.
Добавь доп поле для связи
Id _внешнейСистемы


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


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


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