Как обновить объект в спящем режиме - PullRequest
1 голос
/ 04 июля 2019

У меня проблема с обновлением объекта с Java-кода на postgresql.Когда я обновляю объект, у меня возникают проблемы с идентификатором, потому что идентификатор равен нулю.Таким образом в базе данных создается новая строка вместо перезаписи той же строки.Кажется, что строка в базе данных:

id = 1
name = "name"
then I'm sending a json, like:
{
  name: "newName"
}

, тогда я получаю новую строку, и кажется:

id = 1, name = "name"
id = 2, name = "newName"

Это потому, что когда я отправляю json там идентификаторимеет значение null, поэтому postgresql создает новую строку, но я хочу перезаписать строку с помощью id = 1.Одно из решений добавить в @OneToOne(orphanRemoval = true), но мне это не нравится, потому что оно удаляет старый идентификатор, а затем создает новый идентификатор.Как мне перезаписать начальную строку, если у меня нет идентификатора?

Спасибо!

class A{
@Id
@GeneratedValue
UUID id;

@OneToOne(mappedBy = "A", cascade = CascadeType.ALL)
B b;
}

class B{
 @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;

@OneToOne(optional = false)
@JoinColumn(name = "A_id")
A a;
}

updatedA.setInfo(jsonSend.getInfo());

Ответы [ 3 ]

0 голосов
/ 05 июля 2019

Я использую CrudRepository. Ну какая-то часть кода, сущности:

  public class Human {

  @Id
  @GeneratedValue
  Long id;

  @Column(name = "first_name")
  String firstName;

  @Column(name = "last_name")
  String lastName;

  @JoinColumn(name = "data_document_id")
  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
  @OneToOne(cascade = CascadeType.PERSIST)
  DataDocument dataDocument;

  @OneToMany(mappedBy = "human", cascade = CascadeType.ALL)
  @Singular
  List<Book> books;

}



  public class DataDocument {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  Long id;

  String name;
 }



public class Book {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  Long id;

  Boolean isReaded;

  Integer type;

  Integer cost;

  Instant date;
}

Здесь я делаю POST для создания человека:

{
  "firstName": "firstName",
  "lastName": "lastName",
  "dataDocument": {
      "name": "randomDocument"
    },
  "books": [
    {
      "isReaded": true,
      "type": 0,
      "cost": 100,
      "date": "2019-06-11"
    }
  ]
}


humanRepository.save(human);

Так что все в порядке, мне нужно получить строку в базе данных:

TABLE HUMAN
human_id = 1, firstName = firstName, lastName = lastName, data_document_id = 1

TABLE DOCUMENT_DATA
data_document_id = 1, name = randomDocument

TABLE BOOK
book_id = 1, human_id = 1, type = 0, cost = 100, date = "2019-06-11", isReaded = true

Тогда я хочу обновить моего человека. Например, json:

{
  "id": 1,
  "firstName": "firstName",
  "lastName": "lastName",
  "dataDocument": {
      "name": "NEW_DOCUMENT"
    },
  "books": [
    {
      "isReaded": true,
      "type": 0,
      "cost": 100,
      "date": "2019-06-11"
    }
  ]
}

Мой метод:

  public Human updateHuman(Long humanId, updateHuman){
    Human human = humanRepository.findById(humanId);
    human.setDocumentData(updateHuman.getDocumentData());
    humanRepository.save(human);
  }

Тогда в таблице я получу:

TABLE HUMAN
human_id = 1, firstName = firstName, lastName = lastName, data_document_id = 2

TABLE DOCUMENT_DATA
data_document_id = 1, name = randomDocument
data_document_id = 2, name = NEW_DOCUMENT

В этом проблема. Я хочу перезаписать data_document_id = 1 новым именем. Я знаю некоторые решения, такие как

@OneToOne(orphanRemoval = true) 
, но это даст следующий результат:
TABLE DOCUMENT_DATA
data_document_id = 2, name = NEW_DOCUMENT

Также я могу написать такой код:

  public Human updateHuman(Long humanId, updateHuman){
    Human human = humanRepository.findById(humanId);
    Long id = human.getDocumentData().getId();
    human.setDocumentData(updateHuman.getDocumentData());
    human.getDocumentData().setId(id);
    humanRepository.save(human);
  }

Тогда это будет нормально работать. Но у меня есть 40 полей и 10 из них списки и 10 из них другие объекты со слишком большим количеством полей. Я просто хочу найти самый простой способ, как я могу обновить объект. Я думал о запросе, но я не уверен, что он будет работать. Просто у меня есть ЧЕЛОВЕК до UPDATED_SOME_FIELDS = HUMAN_WITH_UPDATED_SOME_FIELDS.

0 голосов
/ 21 июля 2019

между тем, я решил свою проблему с 'spring beanutils copyproperties', может быть, это кому-нибудь поможет.

0 голосов
/ 04 июля 2019

Отправьте идентификатор клиенту и, когда он позвонит, поставьте / отправьте его обратно. Вы не знаете, какая запись должна быть обновлена ​​без этого (это обычное решение). Другое решение, если имя является уникальным / натуральным идентификатором (я так не думаю), вы можете опубликовать старое имя и новое тоже. Затем выберите запись со старым именем, обновите объект и сохраните.

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