Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在没有映射表的情况下存储JSP HashMap?_Java_Orm_Jpa_Annotations - Fatal编程技术网

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

Java 在没有映射表的情况下存储JSP HashMap?,java,orm,jpa,annotations,Java,Orm,Jpa,Annotations,是否可能有两个类Template和TemplateItem,映射到两个数据库表Template和Template\u item,在这两个表中,它们使用映射连接起来?如果是这样,可以使用注释来完成吗 以下是三个表的结果,即添加了一个不必要的映射表 @Entity @Table(name = "template") public class Template { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Col

是否可能有两个类
Template
TemplateItem
,映射到两个数据库表
Template
Template\u item
,在这两个表中,它们使用
映射连接起来?如果是这样,可以使用注释来完成吗

以下是三个表的结果,即添加了一个不必要的映射表

@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 = "";

}

标准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();
  ...
}
@实体
@表(name=“template”)
公共类模板{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”)
私有长id=0;
@列(name=“name”)
私有字符串名称=”;
//地图左侧映射到地图右侧项目的名称字段
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“template”)
@MapKey(name=“name”)
私有映射项=新HashMap();
...

}
使用联接表有什么问题?这是一种标准化模式的方法,完全是多余的。自动创建的联接表有两个字段,它们都已存储在
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, mappedBy="template")
  @MapKey(name = "name")
  private Map items = new HashMap();
  ...
}