我有一个名为NodeType的类,由SQL Server数据库使用JPA支持.
没有什么特别的,没有关系,只有一些领域.它们甚至更多,但为了简化我省略了它们:
@Entity
@Table(name="node_type")
@NamedQuery(name="NodeType.findAll", query="SELECT n FROM NodeType n")
public class NodeType implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
public NodeType() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
在启动我的应用程序时,我读取它们并将它们全部放入HashMap中,将属性名称作为键以便以后更容易找到它.
在数据库中,目前有五个项目.
id name maxNoExits mandatoryExits defaultExits
== ========= ========== ============== ============
1 NTYPE_HUP 0 NodeHangup
2 NTYPE_ANN 1 NodeAnnounce
3 NTYPE_SLP 1 NodeWait
4 NTYPE_XFR 0 NodeTransfer
5 NTYPE_TBR 32 NodeTimebased
稍后,我不知道究竟发生了什么,每个项目的多个实例突然存在(当前每个项目3个实例)
示例:在应用程序中,我有一个带有值的NodeType实例
1 NTYPE_HUP 0 NodeHangup
eclipse调试器告诉我:
>在我的地图中,实际上有一个项目具有与上述实例相同的值
> map.get为此实例返回null
NodeType类存在> 15个实例
>对于数据库中的每一行,似乎总是存在三个实例.
>比较所有领域,它们似乎是平等的.甚至字符串的id似乎都是相同的.不应该getHash()返回相同而equals()应该返回true然后呢?
最后一点让我感到震惊,因为我没有在我的应用程序中任何地方实现它们!有人知道这发生的时间吗?
如果JPA使用缓存(是吗?),它应该使用@Id列查看以前创建的项目.尽管我正在做多个createQuery,但它们都应该引用相同的项目.还是我错了?
这对我来说都很奇怪,我不知道如何调试它.
我希望有人可以在黑暗中带来一些亮光.
编辑:我可以告诉的是,只要我第一次使用相应的JPA请求,就会存在这15个实例.在构造函数中放置调试器陷阱,我可以确认所有实例是一个接一个地创建的.
Edit2:为了好玩和测试,我只是尝试重新实现hashCode()(简单地返回this.id;)并重写equals()(返回this.id == other.id;)
15个实例仍在那里.因为我只是在阅读,所以我现在不关心它,因为我现在可以将所有这三个实例视为一个相同的项目.但这不是基本问题的解决方案.我怀疑这可能发生在其他地方 – 没有经过测试.