0
TomCatでJPAでSpring Boot Data Restを使用してMySQLにデータを保持しています。スプリングブートデータレストJPA:@ManyToOneがDBのForeignKeyカラムを設定しない
問題:ユーザーを追加するにはJSONが残りのエンドポイントに送信された場合、(両方のMySQLのテーブルが更新されますが、マッピングカラム(phone.user_id)の値が「NULL」に設定されています対応するUser.uidに設定する必要があります)... 意図したとおりに動作するコードには何が欠けていますか?
結果のSQLテーブルと値:
// "user" table // "phone" table
uid | first_name pid | number | user_id
---------------- ------------------------
1 | John 1 | 03432453 | NULL <--- should show 1
2 | 02451254 | NULL <--- should show 1
@OneToMany側:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long uid;
private String firstName;
@OneToMany(cascade=CascadeType.ALL, mappedBy="user", orphanRemoval=true)
private List<Phone> phones;
/* getters and setters */
public void addPhone(Phone phone) {
this.phones.add(phone);
phone.setUser(this);
}
/* UPDATED - method added */
public User updatePhoneUserId(User user) {
List<Phone> phs = user.getPhones();
for (Phone ph : phs) {
ph.setUser(user);
}
return user;
}
}
@ManyToOne側:
@Entity
public class Phone {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long pid;
private String number;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")
private User user;
/* getters and setters*/
}
UserRepositoryとPhoneRepository。
public interface UserRepository extends JpaRepository<User, Long> { }
public interface PhoneRepository extends JpaRepository<Phone, Long> { }
レストコントローラは:
@RestController
@RequestMapping(path="/api")
public class UserController {
@Autowired
private UserRepository ur;
@PostMapping(path="/add")
public @ResponseBody String addNewUserPost(@RequestBody User user) {
// ur.save(user); /* UPDATED - line removed */
ur.save(user.updatePhoneUserId(user)); /* UPDATED - line added */
return "Saved";
}
}
素晴らしい入力!私のための作品 - ありがとう!上記のコードと、*/UPDATED * /とマークされたスニペットを更新しました。それはあなたがするだろうか? – zaggi
@zaggiはいこれがうまくいくはずです。関係があるときは、ユーザーを保存して電話に設定して電話をデータベースに保存する必要があります。ユーザーが保存され、ユーザーテーブルにIDがあるためuser_idをnullにしないでください。 –