存储没有映射表的 JSP HashMap?

Posted

技术标签:

【中文标题】存储没有映射表的 JSP HashMap?【英文标题】:Storing a JSP HashMap without a mapping table? 【发布时间】:2010-09-01 22:45:11 【问题描述】:

是否可以有两个类TemplateTemplateItem,映射到两个数据库表templatetemplate_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    |       |
+----------------+------------+------+-----+---------+-------+

【问题讨论】:

使用连接表有什么问题?这是标准化架构的一种非常标准的方式。 完全是多余的。自动创建的连接表有两个字段,这两个字段都已经存储在TemplateItem 类中。 【参考方案1】:

标准 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();
  ...

【讨论】:

以上是关于存储没有映射表的 JSP HashMap?的主要内容,如果未能解决你的问题,请参考以下文章

HashMap实现原理分析

HashMap的存储原理

HashMapHashtableConcurrentHashMap等深入分析

HashMapHashtableConcurrentHashMap等深入分析

Hash+哈希表+HashMap+HashSet

HashSet和HashMap