Весенние данные. Репозиторий возвращает неверный идентификатор (данные объекта верны) - PullRequest
0 голосов
/ 03 марта 2020

Добрый день, вот проблема: CrudRepository возвращает неправильный идентификатор для сущностей.

Вот базовая сущность пользователя JPA:

@Data
@Entity(name = "user")
@EqualsAndHashCode(exclude = {"roles", "password", "data"})
@ToString(exclude = {"roles", "password", "data"})
public class User {

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

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
        private SomeData data;
...

Существует отношение один к одному с некоторыми data entity.

@Data
@Entity(name = "some_data")
@TypeDefs({
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
@ToString(exclude = {"user", "views", "biData"})
@EqualsAndHashCode(exclude = {"user", "views", "biData"})
public class SomeData {

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

    @OneToOne
    @MapsId
    private User user;
...

И есть хранилище crud:

@Repository
public interface SomeDataRepository extends CrudRepository<SomeData, Long> {

    Optional<SomeData> findByUserId(Long userId);
}

Метод findUserById возвращает правильный объект SomeData из БД, но этот объект имеет тот же идентификатор с userId ... И потому я не могу выполнять другие действия (вставка или обновление таблицы "public_view" нарушает ограничение внешнего ключа "fk_view_to_some_data")

Это довольно странно.

1 Ответ

2 голосов
/ 03 марта 2020

Возможно, проблема в том, что вы используете аннотацию @MapsId. Вот что делает значение аннотации в соответствии с Javado c:

Имя атрибута в составном ключе, которому соответствует атрибут отношения. Если не указано иное, взаимосвязь отображает первичный ключ сущности.

Вы можете попытаться задать значение c для вашей аннотации или по-другому сопоставить ваше отношение один к одному. Например, используйте аннотацию @JoinColumn в вашем классе SomeData:

// ... your annotations ...
public class SomeData {

    // ... your other fields ...

    @OneToOne
    @JoinColumn(name = "some_data_id", referencedColumnName = "id")
    private User user;

}

Вот несколько альтернатив, которые вы можете использовать: https://www.baeldung.com/jpa-one-to-one

...