【发布时间】:2014-07-10 01:49:49
【问题描述】:
对于我从事的项目中的 JPA 实体,List 或 Map 类型的属性始终初始化为同步实现 Vector 和 Hashtable。
(不同步的 ArrayList 和 HashMap 是 Java 中的标准实现,除非确实需要同步。)
有谁知道为什么需要同步集合的原因?我们使用 EclipseLink。
当我问起这件事时,没有人知道为什么会这样。似乎总是这样。也许旧版本的 EclipseLink 需要这个?
我问的原因有两个:
- 我更喜欢像其他任何地方一样使用标准实现 ArrayList 和 HashMap。如果安全的话。
- JDK 中没有匹配的同步 Set 实现。至少不像 EclipseLink 期望的那样是可序列化的。
示例实体:
@Entity
public class Person {
...
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable( ... )
private List<Role> accessRoles;
@ElementCollection
@CollectionTable( ... )
@MapKeyColumn(name="KEY")
@Column(name="VALUE")
private Map<String, String> attrs;
public Person() {
// Why Vector/Hashtable instead of ArrayList/HashMap?
accessRoles = new Vector<Role>();
attrs = new Hashtable<String, String>();
}
public List<Role> getAccessRoles() {
return accessRoles;
}
public void setAccessRoles(List<Role> accessRoles) {
this.accessRoles = accessRoles;
}
public Map<String, String> getAttrs() {
return attrs;
}
public void setAttrs(Map<String, String> attrs) {
this.attrs = attrs;
}
}
【问题讨论】:
-
根据我的经验,由于对Java Collections Framework 的普遍无知,许多开发人员使用 Vector 和 Hashtable。在过去 15 年左右的时间里,我从未见过适当的使用方法。
-
@SteveC 的评论 +50。
标签: java jpa eclipselink