0

私はSpring Frameworkを学んでいます。関係1-1のいくつかのチュートリアルに従ったので、モデルを定義しました.1つのライブラリには1つのアドレスがあります. ボディリクエストでライブラリデータとアドレスからのIDを送信すると、スプリングがレコードを作成しますが、彼は関係を作成できず、アドレスnullを返し、データベースで選択するとaddress_id、テーブルライブラリに保存されません

これは私が試したものです:

私のモデルライブラリ

@Entity
@Table(name = "Bibliotecas")
public class Library implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  private String name;

  @OneToOne
  @JoinColumn(name = "address_id", referencedColumnName = "id")
  private Address address;

  public Library() {
  }

  public long getId() {
    return this.id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Address getAddress() {
    return this.address;
  }

  public void setAddress(Address address) {
    this.address = address;
  }

}

私のモデル住所:

@Entity
public class Address {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column(nullable = false)
  private String location;

  public long getId() {
    return this.id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getLocation() {
    return this.location;
  }

  public void setLocation(String location) {
    this.location = location;
  }

  @OneToOne(mappedBy = "address", fetch = FetchType.LAZY, optional = false)
  private Library library;

}

私のリポジトリ

public interface LibraryRepository extends JpaRepository<Library, Long> {}
public interface AddressRepository extends JpaRepository<Address, Long> {}

私のライブラリリソース:

@RestController
@RequestMapping(value = "/api")
public class LibraryResource {

  @Autowired
  LibraryRepository libraryRepository;

  @GetMapping("/libraries")
  public List<Library> listaBibliotecas() {
    return libraryRepository.findAll();
  }

  @PostMapping("/library")
  public Library salvaBiblioteca(@RequestBody Library library) {
    return libraryRepository.save(library);
  }
}

Postman でこのリクエストを行います。

{
    "name": "library test",
    "address_id": 1
}

Obs: データベースに ID 1 のアドレスが 1 つありますが、次のメッセージが表示されます。

{
    "id": 5,
    "name": "Biblioteca test",
    "address": null
}

リターンで null を受け取るのはなぜですか? そして、なぜ私のレジスタが保存されていないのaddress_idですか?

4

1 に答える 1

1

次の点を考慮してください。

  • アドレスと図書館の間でマッピングを切り替えました
  • パブリック フィールドで Hibernate アノテーションを使用することをお勧めします
  • アドレス -> ライブラリのゲッターとセッターが実装されていません
  • アドレス エンティティに @table アノテーションがありません

これはあなたのために働く必要があります:

ライブラリ:

@Entity
@Table(name = "library")
public class Library implements Serializable {

    private static final long serialVersionUID = 1L;

    private long id;
    private String name;
    private Address address;

    public Library() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return this.id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToOne(mappedBy = "library", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
    public Address getAddress() {
        return this.address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

住所:

@Entity
@Table(name = "address")
public class Address {

    private long id;
    private String location;
    private Library library;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return this.id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Column(nullable = false)
    public String getLocation() {
        return this.location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id")
    public Library getLibrary() {
        return library;
    }

    public void setLibrary(Library library) {
        this.library = library;
    }
}
  • リポジトリをコントローラーに公開しない方がよいでしょう。代わりに、repositoryDao にアクセスできるサービスを参照する必要があります。

  • テーブル名と同じエンティティ名を使用する方が良い方法です。

于 2020-05-19T00:08:08.867 に答える