代码之家  ›  专栏  ›  技术社区  ›  Jay

在没有映射表的情况下存储JSP HashMap?

  •  1
  • Jay  · 技术社区  · 15 年前

    有可能有两个班吗 Template TemplateItem template template_item ,使用 Map<String, TemplateItem> ? 如果是这样的话,可以使用注释来完成吗?

    @Entity
    @Table(name = "template")
    public class Template {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="id")
        private long id = 0;
    
        @Column(name="name")
        private String name = "";
    
        // Left side of map maps to name field of the item on the right side of the map.
        @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
        @MapKey(name = "name")
        private Map<String, TemplateItem> items = new HashMap<String, TemplateItem>();
    
    }
    
    
    @Entity
    @Table(name = "template_item")
    public class TemplateItem {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="id")
        private long id = 0;
    
        // The name field is the unique key for the Template.items Map
        @Column(name="name")
        private String name = "";
    
        @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
        private Template template;
    
        @Column(name="content")
        private String content = "";
    
    }
    

    在mysql中,我们得到三个表,映射表包含从TemplateItem表复制出来的两列:

    +-------------+--------------+------+-----+---------+----------------+
    | Field       | Type         | Null | Key | Default | Extra          |
    +-------------+--------------+------+-----+---------+----------------+
    | id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
    | name        | varchar(100) | NO   | UNI | NULL    |                |
    +-------------+--------------+------+-----+---------+----------------+
    
    +-------------+--------------+------+-----+---------+----------------+
    | Field       | Type         | Null | Key | Default | Extra          |
    +-------------+--------------+------+-----+---------+----------------+
    | id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
    | content     | longtext     | NO   |     | NULL    |                |
    | name        | varchar(120) | NO   |     | NULL    |                |
    | template_id | bigint(20)   | YES  | MUL | NULL    |                |
    +-------------+--------------+------+-----+---------+----------------+
    
    +----------------+------------+------+-----+---------+-------+
    | Field          | Type       | Null | Key | Default | Extra |
    +----------------+------------+------+-----+---------+-------+
    | at_template_id | bigint(20) | NO   | PRI | NULL    |       |
    | items_id       | bigint(20) | NO   | PRI | NULL    |       |
    +----------------+------------+------+-----+---------+-------+
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Pascal Thivent    15 年前

    标准JPA使用一个连接表来实现单向连接 OneToMany

    @Entity
    @Table(name = "template")
    public class Template {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Column(name="id")
      private long id = 0;
    
      @Column(name="name")
      private String name = "";
    
      // Left side of map maps to name field of the item on the right side of the map
      @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="template")
      @MapKey(name = "name")
      private Map items = new HashMap();
      ...
    }