无法让复选框组在我的 vaadin 表单中正常工作

Can't get checkboxgroup to work propperly in my vaadin form

首先要说的是,DBA 不应该在业余时间进行编程,他们应该待在原地。抱歉我没听!

所以我为自己做了一个简单的 java 项目。它基本上最终会成为建立在 Java 和 Vaadin 上的“相当过时的电影租赁”。

我不知道该怎么做,是让我的“电影输入表格”正常工作。我有两个 pojo,Movie 和 MovieGenre,它们具有多对多关系,看起来很公平。但是我无法使表单中的设置正常工作。我已经尝试了几个不同的“multi-select”组件,但是没有一个能正常工作,因为我没有做对...

所以我需要一个指向我在这里缺少的东西的指针...它可能是某种类型的监听器,或者在我的 MovieGenre 对象与“布尔值”之间进行某种转换吗?我已经通过简单的打印语句检查了 Set 在表单打开时是否存在。它是。问题是我 swift 不足以弄清楚如何让我的电影类型与这些复选框一起使用...

感谢您的宝贵时间!

Movie.java 摘录:

@Entity
public class Movie {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "movie_id_seq")
  private Long id;
  @NotEmpty
  private String title;
  @NotEmpty
  @Column(length = 1000)
  private String description;
  private LocalDate releaseDate;
  private LocalDate dateAdded;
  @Range(min = 0, max = 20)
  private Integer numberInStock;
  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(name = "movie_moviegenre", joinColumns = { @JoinColumn(name = "movie_id") }, inverseJoinColumns = {
      @JoinColumn(name = "moviegenre_id") })
  private Set<MovieGenre> movieGenres;

--getters, setters, constuctors

MovieGenre.java 摘录:

@Entity
public class MovieGenre {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "moviegenre_id_seq")
  private Integer id;
  @NotEmpty
  @Column(unique = true)
  private String genre;
  @ManyToMany(mappedBy = "movieGenres")
  private Set<Movie> movies;

--getters, setters, constructors, toString

MovieForm.java 摘录:

public class MovieForm extends FormLayout {
  Binder<Movie> binder = new BeanValidationBinder<>(Movie.class);
  private Movie movie;

--some form elements
  CheckboxGroup<MovieGenre> genres = new CheckboxGroup<>();
--some more form elements

  public MovieForm(Set<MovieGenre> movieGenres) {
    addClassNames("movie-form", "form");
    binder.bindInstanceFields(this);

    genres.setLabel("Genres");
    genres.setItems(movieGenres);
    genres.setItemLabelGenerator(MovieGenre::getGenre);
    // genres.addValueChangeListener();

    // FIXME: This does not work, boxes don't get checked... or saved for that
    // matter
    // binder.forField(genres).bind(Movie::getMovieGenres, Movie::setMovieGenres);

    add(
        title,
        configureDescription(),
        genres,
        releaseDate,
        dateAdded,
        configureNumberInStock(),
        createButtonLayout());
  }

谢谢@Avec 和@cfrick,你们都引导我正确。 我需要实现 hashCodeequals 的覆盖,我现在更好地理解了它们的两个目的,并意识到我应该更深入地研究。 但后来我还需要手动绑定 checkboxgroup

binder.forField(genres).bind(Movie::getMovieGenres, Movie::setMovieGenres);

非常感谢。你的评论就是全部。太棒了!