在JPA中引用另一个表的PK的表的两列

时间:2017-03-28 17:42:29

标签: jpa entity-relationship

我们有两张桌子

表1(名称=注释,PK是“ID”):(查找表)

ID Description Type
​1  Desc1       Type1
2  Desc2       Type2

表2(名称=步骤,PK为“ID”):(必须保留并检索值)

ID  Value    Comment1    Comment2
1   Value1    1           2
2   Value2    1           NULL

Comment1和Comment2分别指table1的ID。

对于表2中的每个步骤,可能有不同的comment1和comment2组合引用table1(Comment1-具有值w.r.t table1,类型为Type1,类似于Comment2)。

在JPA中为实体步骤中的实体注释定义的关系是什么?我们尝试了ManyToOne对step1的comment1和comment2,并在检索数据时遇到以下问题(尽管在保存数据时没有问题),

从Step中检索数据时,在持久化后立即检索数据的某些情况下,不会获取注释的描述。但是在服务器重新启动后获取了该值。在获取时我们是否必须显式连接表(尝试使用条件查询进行左连接)。我们是否应该编辑获取类型(尝试既渴望又懒惰)。或者它是否必须对缓存刷新提示做任何事情?

目前使用的注释,

@ManyToOne(fetch =FetchType.Eager, optional = false, cascade = CascadeType.REFRESH)

1 个答案:

答案 0 :(得分:0)

您的设计未正常化。您应该在注释和步骤表之间添加一个中间表。

comment table
    ID Description Type
    ​1  Desc1       Type1
    2  Desc2       Type2

step_comment table
    step_id comment_id
    1           1
    1           2
    2           1

step table
    ID  Value    
    1   Value1   
    2   Value2 

您应该考虑使用多对多关联。下面是2个实体之间的多对多双向关联的例子:

@Entity
public class Step {

  @Id
  @Column(name="ID")
  private long id;
  ...
  @ManyToMany
  @JoinTable(
      name="step_comment",
      joinColumns=@JoinColumn(name="step_id", referencedColumnName="ID"),
      inverseJoinColumns=@JoinColumn(name="comment_id", referencedColumnName="ID"))
  private List<Comment> comments;
  .....
}

@Entity
public class Comment {

  @Id
  @Column(name="ID")
  private long id;
  ...
  @ManyToMany(mappedBy="comments")
  private List<Step> steps;
  ...
}

有关更多信息,请参阅JPA Wiki:https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany