2010-09-01 64 views
1

它可能有两个类TemplateTemplateItem,映射到两个数据库表templatetemplate_item,它们使用Map<String, TemplateItem>?如果是这样,可以使用注释完成?存储没有映射表的JSP HashMap?

以下结果在三个表中,即添加一个不必要的映射表。

@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 |  | 
+----------------+------------+------+-----+---------+-------+ 
+0

使用连接表有什么问题?这是规范化模式的一种非常标准的方式。 – 2010-09-01 22:48:55

+0

它是完全多余的。自动创建的连接表有两个字段,这两个字段已存储在'TemplateItem'类中。 – Jacob 2010-09-01 22:50:42

回答

2

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