为什么我的网格显示实体字段 - Vaadin 14
Why does my grid shows the entity fields - Vaadin 14
我有这些实体。
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Language {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String language;
}
和
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Sentence {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String wordInFrench;
@NotNull
private String wordInOtherLanguage;
@ManyToOne(cascade = CascadeType.ALL)
@NotNull
private Language language;
}
目的是创建一个 drowndown 组合框,它使用以下代码实现:
@Route("addSentence")
@CssImport("./styles/shared-styles.css")
@CssImport(value = "./styles/vaadin-text-field-styles.css", themeFor = "vaadin-text-field")
public class AddSentenceView extends AppLayout {
/**
*
*/
private static final long serialVersionUID = 1L;
public AddSentenceView(SentenceService sentenceService, LanguageService languageService) {
Top top = new Top();
top.setTopAppLayout(this);
// crud instance
GridCrud<Sentence> crud = new GridCrud<>(Sentence.class);
// grid configuration
crud.getGrid().setColumns("wordInFrench", "wordInOtherLanguage", "language");
crud.getGrid().setColumnReorderingAllowed(true);
// form configuration
crud.getCrudFormFactory().setUseBeanValidation(true);
crud.getCrudFormFactory().setVisibleProperties("wordInFrench", "wordInOtherLanguage", "language");
crud.getCrudFormFactory().setFieldProvider("language",
new ComboBoxProvider<>("Language", languageService.findAll(), new TextRenderer<>(Language::getLanguage), Language::getLanguage));
// layout configuration
setContent(crud);
// logic configuration
crud.setOperations(
() -> sentenceService.findAll(),
sentence -> sentenceService.save(sentence),
sentence -> sentenceService.save(sentence),
sentence -> sentenceService.delete(sentence)
);
}
}
但结果看起来是这样的。我只想查看属性 language
。不是 Language(id = 5, language = fikus")
。我应该怎么做才能做到这一点?
我正在使用带有 CRUD 插件的 Vaadin 14。
https://vaadin.com/directory/component/crud-ui-add-on
Language
字段是一个对象,由于您没有定义如何显示它,所以默认为toString
方法。
您在网格中看到的是由 Lombok 生成的 Language#toString
方法的输出。
您可以尝试将 "language"
更改为 "language.language"
以获得实际的字符串字段。另一种选择是手动将列添加为 addColumn(sentence -> sentence.getLanguage().getLanguage())
.
P.S:您可能不想在从 Sentence
到 Language
的关系中使用 CascadeType.ALL
。这意味着如果你删除一个句子,它也会删除语言。
我有这些实体。
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Language {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String language;
}
和
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Sentence {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String wordInFrench;
@NotNull
private String wordInOtherLanguage;
@ManyToOne(cascade = CascadeType.ALL)
@NotNull
private Language language;
}
目的是创建一个 drowndown 组合框,它使用以下代码实现:
@Route("addSentence")
@CssImport("./styles/shared-styles.css")
@CssImport(value = "./styles/vaadin-text-field-styles.css", themeFor = "vaadin-text-field")
public class AddSentenceView extends AppLayout {
/**
*
*/
private static final long serialVersionUID = 1L;
public AddSentenceView(SentenceService sentenceService, LanguageService languageService) {
Top top = new Top();
top.setTopAppLayout(this);
// crud instance
GridCrud<Sentence> crud = new GridCrud<>(Sentence.class);
// grid configuration
crud.getGrid().setColumns("wordInFrench", "wordInOtherLanguage", "language");
crud.getGrid().setColumnReorderingAllowed(true);
// form configuration
crud.getCrudFormFactory().setUseBeanValidation(true);
crud.getCrudFormFactory().setVisibleProperties("wordInFrench", "wordInOtherLanguage", "language");
crud.getCrudFormFactory().setFieldProvider("language",
new ComboBoxProvider<>("Language", languageService.findAll(), new TextRenderer<>(Language::getLanguage), Language::getLanguage));
// layout configuration
setContent(crud);
// logic configuration
crud.setOperations(
() -> sentenceService.findAll(),
sentence -> sentenceService.save(sentence),
sentence -> sentenceService.save(sentence),
sentence -> sentenceService.delete(sentence)
);
}
}
但结果看起来是这样的。我只想查看属性 language
。不是 Language(id = 5, language = fikus")
。我应该怎么做才能做到这一点?
我正在使用带有 CRUD 插件的 Vaadin 14。 https://vaadin.com/directory/component/crud-ui-add-on
Language
字段是一个对象,由于您没有定义如何显示它,所以默认为toString
方法。
您在网格中看到的是由 Lombok 生成的 Language#toString
方法的输出。
您可以尝试将 "language"
更改为 "language.language"
以获得实际的字符串字段。另一种选择是手动将列添加为 addColumn(sentence -> sentence.getLanguage().getLanguage())
.
P.S:您可能不想在从 Sentence
到 Language
的关系中使用 CascadeType.ALL
。这意味着如果你删除一个句子,它也会删除语言。