我们有两张桌子
表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)
答案 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