JPA OneToOne ассоциация без внешнего ключа всегда терпит неудачу

#java #spring #hibernate #jpa

#java #spring #переход в спящий режим #jpa

Вопрос:

Я новичок в JPA / Hibernate, я создаю простое объединение для получения некоторых данных в другой таблице, давайте посмотрим, как это:

введите описание изображения здесь

Целью является получение данных M_PROFILE на основе столбца M_USER.username, но вы ясно видите, что в таблице M_PROFILE нет внешнего ключа.

Я просто пытаюсь использовать приведенный ниже код, но безрезультатно и всегда получаю ошибку.

Класс объектов пользователя

 @Entity
@Table(name = "M_USER")
public class User {

        @Id
        @Column(name = "id")
        private String uuid;

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

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

        @OneToOne(fetch = FetchType.LAZY)
        @MapsId("username")
        private Profile profile;

        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }

        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }

        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }

        public Profile getProfile() {
            return profile;
        }
        public void setProfile(Profile profile) {
            this.profile = profile;
        }
    }
  

Класс сущности профиля

 @Entity
@Table(name = "M_PROFILE")
public class Profile {

    private String username;
    private String phone;
    private String address;

    @Id
    @Column(name = "username", nullable = false)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "phone")
    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Basic
    @Column(name = "address")
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
  

Я получил другую ошибку при вызове

 User user = userRepository.findByUsername("aswzen");
String phone = user.getProfile().getPhone();
  

например, этот.

«USER0_».»PROFILE_USERNAME»: недопустимый идентификатор

Нужна помощь, заранее спасибо,

ПРИМЕЧАНИЕ: у меня нет привилегий изменять таблицу..

Комментарии:

1. Я не уверен, но вместо этого может потребоваться добавить аннотации к получателю.

2. это, безусловно, работает.. код выполняется в текущей среде

3. профиль частного профиля; —> сделайте его заглавным P

4. это опечатка .. мой профиль уже является закрытым profile; ..

Ответ №1:

Не забудьте отключить возможность вставки и обновления для JoinColumn

 @OneToOne
@JoinColumn(name = "username", referencedColumnName = "username", updatable = false, insertable = false)
private profile profile;
  

Ответ №2:

Попробуйте указать объединяемый столбец:

 @OneToOne
@JoinColumn(name = "username", referencedColumnName = "username")
private profile profile;
  

@MapsId Здесь вам это действительно не нужно.

Комментарии:

1. не работает, получена ошибка ..выберите user0_.profile как profile1_14_ и т.д. И т.п. у user0_ пользователей, где user0_.username=?; Сообщение об ошибке = ORA-00904: «M_USER0_».»ПРОФИЛЬ»: недопустимый идентификатор

Ответ №3:

Я рекомендую создать третью таблицу с отношениями для ваших таблиц

 @Entity
@Table(name = "M_USER")
public class User {

@OneToOne(fetch = FetchType.LAZY)
@JoinTable(
name = "user_profile",
joinColumns = @JoinColumn(name="user_id"),
inverseJoinColumns = @JoinColumn(name="profile_username")
 )
private Profile profile;


UPDATE user_profile 
SET user_id = (
    SELECT id
    FROM M_USER
);


UPDATE user_profile 
SET profile_username = (
    SELECT username
    FROM M_USER
);
  

Комментарии:

1. у меня нет доступа ни к изменению, ни к созданию таблицы.. итак, таблица как есть