Orm 映射三个表之间的关系,并使用Vaadin+;弹簧靴

Orm 映射三个表之间的关系,并使用Vaadin+;弹簧靴,orm,spring-boot,vaadin,relationships,Orm,Spring Boot,Vaadin,Relationships,尝试学习Vaadin plus SpringBoot关系,并使用此项目作为基础,通过示例查看组件 它有很多实体,但我正在将其调整为更复杂的实体-关系模型,其中: 角色具有新的关系技能:一对多 技能类型:多对一 将技能链接到角色时,它有一个级别(SkillLevel)。例子: 角色[高级软件开发人员]具有[西班牙语]技能和[流利] 角色[Jr Software Developer]具有[西班牙语]技能和[基础]水平 我的角色是: @Entity @Table(name = "roles") p

尝试学习Vaadin plus SpringBoot关系,并使用此项目作为基础,通过示例查看组件

它有很多实体,但我正在将其调整为更复杂的实体-关系模型,其中:

  • 角色具有新的关系技能:一对多
  • 技能类型:多对一
  • 将技能链接到角色时,它有一个级别(SkillLevel)。例子:
    • 角色[高级软件开发人员]具有[西班牙语]技能和[流利]
    • 角色[Jr Software Developer]具有[西班牙语]技能和[基础]水平
  • 我的角色是:

    @Entity
    @Table(name = "roles")
    public class Role implements Serializable {
    
        private static final long serialVersionUID = -586627565466025158L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        @NotNull
        @Column(unique = true)
        private String name;
    
        @ManyToMany(fetch = FetchType.EAGER)
        private Set<Right> rights;
    
        //@ManyToMany(fetch = FetchType.EAGER)
        //private Set<SkillSkillLevel> skillSkillLevels;
    
        public Role() {
            this.rights = new HashSet<Right>();
            //this.skillSkillLevels = new HashSet<SkillSkillLevel>();
        }
    
        public Role(String name) {
            this();
            this.name = name;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void addRight(Right right) {
            rights.add(right);
        }
    
        public void addRights(Set<Right> rights) {
            this.rights.addAll(rights);
        }
    
        public void removeRight(String right) {
            rights.remove(right);
        }
    
        public Set<Right> getRights() {
            return new HashSet<Right>(rights);
        }
    
        public boolean hasRight(String name) {
            name = name.toLowerCase();
            if (name == null) {
                return false;
            }
            for (Right r : rights) { 
                if (r.getName().equals(name) || r.getName().equals("super_admin")) {
                    return true;
                }
            }
            return false;
        }
    
        public void clearRights() {
            this.rights.clear();
        }
    
        public String toString() {
            return name;
        }
    
        @Override
        public boolean equals(Object other) {
            if (!(other instanceof Role))
                return false;
            if (this.getId() == null) {
                return this == other;
            } else {
                Role o = (Role) other;
                return this.getId().equals(o.getId());
            }
        }
    
        @Override
        public int hashCode() {
            return getName().hashCode();
        }
    
    技能水平:

    @Entity
    @Table(name = "skillLevels")
    public class SkillLevel implements Serializable, Comparable {
    
        private static final long serialVersionUID = -8126472682725739996L;
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer id;
        @NotNull
        @Column(unique=true)
        private String name;
    
        public String toString() {
            return String.format("%s", name);
        }
    
        public SkillLevel() {}
    
        public SkillLevel(String name) {
            this();
            this.name = name;
        }
    
        @Override
        public boolean equals(Object other) {
            if (!(other instanceof SkillLevel))
                return false;
            if (this.getId() == null) {
                return this == other;
            } else {
                SkillLevel o = (SkillLevel) other;
                return this.getId().equals(o.getId());
            }
        }
    
        @Override
        public int hashCode() {
            return getName().hashCode();
        }
    
        public Integer getId() { return id; }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() { return name; }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public int compareTo(Object o) {
            if (o != null && o instanceof SkillLevel) {
                SkillLevel other = (SkillLevel)o;
                return name.compareTo(other.getName());
            }
            return 0;
        }
    }
    
    我应该创建一个名为RoleSkillLevel的新实体来设置表将加入三个ID(role\u skill\u level)还是有更好的方法来创建它


    在角色视图中,当创建新的角色技能级别条目时,有什么有用的UI组件可以添加和删除技能+级别行

    我会尽可能远离GUI,不让所有的ORM/DB内容进入。用最能代表GUI的数据构建GUI;为您的域模型使用一些CQRS层。对于UI组件,想象一下,作为用户,您希望如何快速完成工作?可以是表格/网格,可以是将组件添加到某个布局中的东西。将其包装到CustomField中,并处理您的UI模型。您将数据库模型、业务模型和视图模型混合在一起。您应该隔离所有与数据库相关的实体,仅用于数据库操作。将业务逻辑与从数据库模型推导出来的新模型放在一起。然后,您应该在业务模型的UI上传递需要查看的数据,并对其进行处理。。尽量使用视图UI中的简单数据结构。您可以仅使用字符串值构建视图(例如,vaadin表或网格)。希望这能指引你!!!
    @Entity
    @Table(name = "skillLevels")
    public class SkillLevel implements Serializable, Comparable {
    
        private static final long serialVersionUID = -8126472682725739996L;
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer id;
        @NotNull
        @Column(unique=true)
        private String name;
    
        public String toString() {
            return String.format("%s", name);
        }
    
        public SkillLevel() {}
    
        public SkillLevel(String name) {
            this();
            this.name = name;
        }
    
        @Override
        public boolean equals(Object other) {
            if (!(other instanceof SkillLevel))
                return false;
            if (this.getId() == null) {
                return this == other;
            } else {
                SkillLevel o = (SkillLevel) other;
                return this.getId().equals(o.getId());
            }
        }
    
        @Override
        public int hashCode() {
            return getName().hashCode();
        }
    
        public Integer getId() { return id; }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() { return name; }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public int compareTo(Object o) {
            if (o != null && o instanceof SkillLevel) {
                SkillLevel other = (SkillLevel)o;
                return name.compareTo(other.getName());
            }
            return 0;
        }
    }