Обновить строку в БД другим уникальным значением вместо первичного ключа, используя Hibernate? - PullRequest
0 голосов
/ 05 апреля 2019

Я пишу веб-сервис REST.Я создаю следующую сущность Author:

@Entity
@Table(name = "author")
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "authorId", unique = true, nullable = false)
    private int authorId;

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

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

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

    @Column(name = "age")
    private int age;

    @OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
    private List<Book> bookList;

    public Author() {
    }

    public Author(int authorId, String name, String surname, String nationality, int age) {
        this.authorId = authorId;
        this.name = name;
        this.surname = surname;
        this.nationality = nationality;
        this.age = age;
    }
}

Значение id в БД, использующее как Первичный ключ только внутри БД для ссылок на другие таблицы.А для идентификации сущностей по URL (например, /rest/Author/{authorId}) используйте другое значение - authorId.Я также не использовал его в конструкторе сущностей.Метод updateAuthor DAO выглядит следующим образом:

public Author updateAuthor(Author author) {
    Session session = getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    session.update(author);
    transaction.commit();

    Author updated = (Author) session
            .createQuery("FROM Author WHERE authorId=" + author.getAuthorId())
            .uniqueResult();

    session.close();
    return updated;
}

Но он не работает должным образом ... Когда я пытаюсь обновить существующую сущность с помощью authorId = 4:

Author author1 = authorDao.updateAuthor(new Author(4, "qweqwe", "qweqwe", "qweqwe", 1000));

Getследующий выполненный HQL-запрос:

Hibernate: update author set age=?, authorId=?, authorName=?, nationality=?, authorSurname=? where id=?

и следующее исключение:

Exception in thread "main" org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Как это исправить, не задавая все значения отдельно ??

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Вы можете попробовать это у себя:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;

Замените на это и попробуйте

@Column(name = "id", updatable = false, nullable = false)
0 голосов
/ 05 апреля 2019

Я нашел решение!

Нужно просто удалить id свойство из модели Author и вставить @Id аннотацию над authorId значением:

@Entity
@Table(name = "author")
public class Author {

    @Id
    @Column(name = "authorId", unique = true, nullable = false)
    private int authorId;

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

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

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

    @Column(name = "age")
    private int age;

    @OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
    private List<Book> bookList;

    public Author(){
    }

    public Author(int authorId, String name, String surname, String nationality, int age) {
        this.authorId = authorId;
        this.name = name;
        this.surname = surname;
        this.nationality = nationality;
        this.age = age;
    }
}

Так что теперь Hibarnate получим как id точно authorId. Теперь работает нормально.

...