无法让复选框组在我的 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,你们都引导我正确。
我需要实现 hashCode
和 equals
的覆盖,我现在更好地理解了它们的两个目的,并意识到我应该更深入地研究。
但后来我还需要手动绑定 checkboxgroup
:
binder.forField(genres).bind(Movie::getMovieGenres, Movie::setMovieGenres);
非常感谢。你的评论就是全部。太棒了!
首先要说的是,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,你们都引导我正确。
我需要实现 hashCode
和 equals
的覆盖,我现在更好地理解了它们的两个目的,并意识到我应该更深入地研究。
但后来我还需要手动绑定 checkboxgroup
:
binder.forField(genres).bind(Movie::getMovieGenres, Movie::setMovieGenres);
非常感谢。你的评论就是全部。太棒了!