存储没有映射表的 JSP HashMap?
Posted
技术标签:
【中文标题】存储没有映射表的 JSP HashMap?【英文标题】:Storing a JSP HashMap without a mapping table? 【发布时间】:2010-09-01 22:45:11 【问题描述】:是否可以有两个类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 | |
+----------------+------------+------+-----+---------+-------+
【问题讨论】:
使用连接表有什么问题?这是标准化架构的一种非常标准的方式。 完全是多余的。自动创建的连接表有两个字段,这两个字段都已经存储在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?的主要内容,如果未能解决你的问题,请参考以下文章
HashMapHashtableConcurrentHashMap等深入分析