JPA 引文映射(集合类的使用)
JPA 注解映射(集合类的使用)
一.集合类的选择
在映射关系时,可以使用的集合类有Collection、Set、List和Map。下面来看一下如何选择使用这些不同的集合类。
二.集合类的区别
在映射集合类时,通常要考虑以下几个问题。
(1)明确集合中的具体类型。
在JDK 5.0中提出了范型的概念,主要是可以明确集合类中所保存对象的类型。通常的写法如下代码所示。
其中,加粗的部分明确指明了Collection集合对象中存放的是CustomerEO对象。这可以避免在运行时导致的一些异常。
(2)定义时使用接口,初始化使用具体的类。
在定义集合类型时,通常使用接口如Collection、Set、List和Map等,但初始化时要明确指定所使用的类型。
Collection可以初始化为ArrayList或HashSet,例如:
Set可以初始化为HashSet,例如:
List可以初始化为ArrayList,例如:
Map可以初始化为HashMap,例如:
(3)集合类的选择。
这四个常用的集合类不同的区别主要有以下所示,所以根据不同的情况来确定选择适合的集合类。
Collection类是Set和List的父类,在未确定使用Set还是List时可使用。
Set集合中的对象不能有重复,并且是无序的。
List集合中的对象可以有重复,并且可以有序排列。
Map集合是带有key和value值的集合。
三.带排序的集合
如果使用了List集合,可以同时配合注释@OrderBy使查询出来的集合类按照一定的顺序排列。例如以下代码中将按照AddressEO中的属性postcode升序排列。
在使用@OrderBy注释事应注意以下几个问题。
@OrderBy用于标注集合中实体对象的顺序。如果不指定,将按照实体的的主键升序排列。
可以同时指定多个列的排列顺序,并指定升序还是降序。例如首先按照id升序,然后按照postcode 降序排列的代码如下所示。
@OrderBy("id ASC,postcode DESC")
若不指定升序ASC或者降序DESC,默认为升序排列。
四.带Key值的集合
如果使用了Map集合,可以同时配合注释@MapKey指定Map中存放的key值。例如以下代码中将AddressEO中的属性id作为key值保存在Map中。
在使用@ MapKey注释事应注意以下几个问题。
@ MapKey用于标注Map中的key值。name的值指定Map类存放哪个实体的属性作为key值。
若不指定key值,默认为实体的主键作为key值。
引用
一.集合类的选择
在映射关系时,可以使用的集合类有Collection、Set、List和Map。下面来看一下如何选择使用这些不同的集合类。
二.集合类的区别
在映射集合类时,通常要考虑以下几个问题。
(1)明确集合中的具体类型。
在JDK 5.0中提出了范型的概念,主要是可以明确集合类中所保存对象的类型。通常的写法如下代码所示。
private Collection<CustomerEO> customers = new ArrayList<CustomerEO>();
其中,加粗的部分明确指明了Collection集合对象中存放的是CustomerEO对象。这可以避免在运行时导致的一些异常。
(2)定义时使用接口,初始化使用具体的类。
在定义集合类型时,通常使用接口如Collection、Set、List和Map等,但初始化时要明确指定所使用的类型。
Collection可以初始化为ArrayList或HashSet,例如:
private Collection<CustomerEO> customers = new ArrayList<CustomerEO>(); 或者 private Collection<CustomerEO> customers = new HashSet<CustomerEO>();
Set可以初始化为HashSet,例如:
private Set<CustomerEO> customers = new HashSet<CustomerEO>();
List可以初始化为ArrayList,例如:
private List<CustomerEO> customers = new ArrayList<CustomerEO>();
Map可以初始化为HashMap,例如:
private Map<String,CustomerEO> customer = new HashMap<String,CustomerEO>();
(3)集合类的选择。
这四个常用的集合类不同的区别主要有以下所示,所以根据不同的情况来确定选择适合的集合类。
Collection类是Set和List的父类,在未确定使用Set还是List时可使用。
Set集合中的对象不能有重复,并且是无序的。
List集合中的对象可以有重复,并且可以有序排列。
Map集合是带有key和value值的集合。
三.带排序的集合
如果使用了List集合,可以同时配合注释@OrderBy使查询出来的集合类按照一定的顺序排列。例如以下代码中将按照AddressEO中的属性postcode升序排列。
@Entity @Table(name = "customer") public class CustomerEO implements java.io.Serializable { …… private List<AddressEO> addresses = new ArrayList<AddressEO>(); @OneToMany(mappedBy="customer") @OrderBy("postcode ASC") public List<AddressEO> getAddresses() { return addresses; } public void setAddresses(List addresses) { this.addresses = addresses; } }
在使用@OrderBy注释事应注意以下几个问题。
@OrderBy用于标注集合中实体对象的顺序。如果不指定,将按照实体的的主键升序排列。
可以同时指定多个列的排列顺序,并指定升序还是降序。例如首先按照id升序,然后按照postcode 降序排列的代码如下所示。
@OrderBy("id ASC,postcode DESC")
若不指定升序ASC或者降序DESC,默认为升序排列。
四.带Key值的集合
如果使用了Map集合,可以同时配合注释@MapKey指定Map中存放的key值。例如以下代码中将AddressEO中的属性id作为key值保存在Map中。
@Entity @Table(name = "customer") public class CustomerEO implements java.io.Serializable { …… private Map<Integer,AddressEO> addresses = new HashMap<Integer,AddressEO>(); @OneToMany(mappedBy="customer") @MapKey(name="id") public Map<Integer, AddressEO> getAddresses() { return addresses; } public void setAddresses(Map<Integer, AddressEO> addresses) { this.addresses = addresses; } }
在使用@ MapKey注释事应注意以下几个问题。
@ MapKey用于标注Map中的key值。name的值指定Map类存放哪个实体的属性作为key值。
若不指定key值,默认为实体的主键作为key值。