#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. у меня нет доступа ни к изменению, ни к созданию таблицы.. итак, таблица как есть