#java #spring #hibernate #spring-boot
#java #spring #переход в спящий режим #весенняя загрузка
Вопрос:
Я разрабатываю приложение REST API с использованием spring boot и столкнулся с сопоставлением «Один ко многим» при использовании свойства mappedBy. У меня есть класс User и класс Usermeata, у пользователя может быть более одной usermeta.
Хотя программа успешно сохраняет внешний ключ при использовании JoinColumn, я хочу знать, какую ошибку я совершаю при использовании mappedby.
Вот мой код:
Класс сущности пользователя:
@Entity
@Table(name="User")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userId;
@Column(unique=true)
private String username;
@Column(unique=true)
private String emailId;
private String password;
private String firstName;
private String lastName;
private String phoneNo;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="user")
// @JoinColumn(name="user_id")
private List<UserMeta> userMetaList=new ArrayList();
public List<UserMeta> getUserMetaList() {
return userMetaList;
}
public void setUserMetaList(List<UserMeta> userMetaList) {
this.userMetaList = userMetaList;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmailId() {
return emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
}
Класс UserMeta:
@Entity
public class UserMeta {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userMetaId;
@ManyToOne
@JoinColumn(name="user_id")
private User user;
private String _key;
private String _value;
public Long getUserMetaId() {
return userMetaId;
}
public void setUserMetaId(Long userMetaId) {
this.userMetaId = userMetaId;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String get_key() {
return _key;
}
public void set_key(String _key) {
this._key = _key;
}
public String get_value() {
return _value;
}
public void set_value(String _value) {
this._value = _value;
}
}
UserService.class
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUser(Long userId) {
return userRepository.getOne(userId);
}
public List<User> getAllUser() {
return userRepository.findAll();
}
public User addUser(User user) {
return userRepository.save(user);
}
public void removeUser(User user) {
userRepository.delete(user);
}
public void updateUser(User user) {
userRepository.save(user);
}
}
ОПУБЛИКОВАТЬ запрос:
{
"username":"myusername",
"emailId":"myemailid@gmail.com1",
"password":"2323@123",
"firstName":"myfname",
"lastName":"mlname",
"phoneNo":"000000",
"userMetaList":[
{
"_key":"api_key",
"_value":"api_key_value"
},
{
"_key":"prop1",
"_value":"val1"
}
]
}
Теперь таблицы созданы и обновлены значениями, однако столбец user_id в таблице usermeta всегда равен нулю..
Комментарии:
1. Опубликуйте код, который вы используете для их сохранения.
2. Этот вопрос задавался уже миллион раз. Столбец user_id равен null, потому что
user
поле ваших объектов UserMeta равно null. Все очень просто.3. Я много раз просматривал Google и stackoverflow, к сожалению, ничего, казалось, не работало (возможно, я реализовал неправильно, поэтому моим последним средством было опубликовать вопрос самостоятельно.) . Как мне назначить user полю user в Usermeta?
4. Как мне назначить пользователя полю user в Usermeta : путем вызова
userMeta.setuser(theOwningUser)
. почему приложение работает нормально при использовании @JoinTable вместо mappedBy : потому что в этом случае у вас есть однонаправленная ассоциация, где у UserMeta даже нет пользовательского поля, и где сторона-владелец ассоциации — User.userMetaList, а не UserMeta.user. Прочитайте документацию. Там все объяснено.5. Нет. Это просто … хорошее именование: метод добавляет UserMeta, поэтому вы называете метод
addUserMeta
. Если бы метод запустил двигатель автомобиля, вы бы назвали егоstartCarEngine
.