为什么我的网格显示实体字段 - 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:您可能不想在从 SentenceLanguage 的关系中使用 CascadeType.ALL。这意味着如果你删除一个句子,它也会删除语言。