JPA OneToOne ассоциация без внешнего ключа всегда терпит неудачу - PullRequest
0 голосов
/ 28 марта 2019

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

enter image description here

Цель - получить данные 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": неверный идентификатор

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

Примечание: у меня нет привилегии дляизменить таблицу ..

Ответы [ 2 ]

1 голос
/ 29 марта 2019

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

@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 голос
/ 28 марта 2019

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

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

Вам не нужно @MapsId здесь.

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