2017-10-08 7 views
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"; 
    } 
} 

答えて

1

データベースリポジトリモデルにユーザーを保存した後、このようなIDとして更新された値をユーザオブジェクトを返します。

だから次のようにします。

user = ur.save(user); 

したがって、ユーザーオブジェクトがリポジトリ戻り、idがもうnullではないことをオブジェクトに置き換えられます。

+0

素晴らしい入力!私のための作品 - ありがとう!上記のコードと、*/UPDATED * /とマークされたスニペットを更新しました。それはあなたがするだろうか? – zaggi

+0

@zaggiはいこれがうまくいくはずです。関係があるときは、ユーザーを保存して電話に設定して電話をデータベースに保存する必要があります。ユーザーが保存され、ユーザーテーブルにIDがあるためuser_idをnullにしないでください。 –

関連する問題