Хранить JSP HashMap без таблицы сопоставления? - PullRequest
1 голос
/ 02 сентября 2010

Возможно ли иметь два класса 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 Ответ

2 голосов
/ 02 сентября 2010

Стандартный 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<b>, mappedBy="template"</b>)
  @MapKey(name = "name")
  private Map items = new HashMap();
  ...
}
...