概述
CollectionModel.java
import
hibernate.pojo.annotation.Image;
import
java.util.ArrayList;
import
java.util.Collection;
import
java.util.HashMap;
import
java.util.HashSet;
import
java.util.List;
import
java.util.Map;
import
java.util.Set;
import
javax.persistence.Column;
import
javax.persistence.ElementCollection;
import
javax.persistence.Embeddable;
import
javax.persistence.Entity;
import
javax.persistence.GeneratedValue;
import
javax.persistence.Id;
import
javax.persistence.JoinColumn;
import
javax.persistence.JoinTable;
import
javax.persistence.MapKeyColumn;
import
javax.persistence.Table;
import
org.hibernate.annotations.CollectionId;
import
org.hibernate.annotations.GenericGenerator;
import
org.hibernate.annotations.IndexColumn;
import
org.hibernate.annotations.OrderBy;
import
org.hibernate.annotations.Type;
@Entity
@Table
(name =
"collection"
)
@GenericGenerator
(name =
"nat"
, strategy =
"increment"
)
public
class
CollectionModel {
@Id
@GeneratedValue
(generator =
"nat"
)
private
long
id;
private
String name;
/**
* 对于@ElementCollection中targetClass代表的是collection类型,
* 如果显示指定了collection类型,则hibernate不会自动侦测元素类型,此时必须告诉
* 告诉hiberate应以何种type解析collection包含元素,
* targetClass默认为集合类型,所以也可以写成@ElementCollection即可,
* 如果没有显示指定集合类型,则可以省略@ElementCollection
* 对于@JoinColumn属性nullable应该设为nullable = false,保证关联表数据保持一致
*/
@ElementCollection
(targetClass = java.lang.String.
class
)
@JoinTable
(name =
"item"
, joinColumns = {
@JoinColumn
(nullable =
false
, name =
"item_id"
, referencedColumnName =
"id"
) })
@Column
(name =
"filename"
, nullable =
false
)
private
Set<String> images =
new
HashSet<String>();
/**
*
* 插入list集合
* 【list集合中需要额外加入@IndexColumn】来建立一个序列标识符,
* 如果无@IndexColumn,则会当做一个包集合处理,
* 相当于xml中的<bag></bag>标签
*/
@ElementCollection
(targetClass = java.lang.String.
class
)
@JoinTable
(name =
"item"
, joinColumns = {
@JoinColumn
(nullable =
false
, name =
"item_id"
) })
@IndexColumn
(name =
"position"
, base =
1
)
/* 此处为list-index标识 位置 */
@Column(name = "filename", nullable = false)
@OrderBy(clause="item_id desc")
private List<String> listImages = new ArrayList<String>();
/**
*
* 插入map集合
* map集合中加入特殊的@MapKeyColumn
*/
@ElementCollection
@JoinTable(name="item", joinColumns={ @JoinColumn(nullable=false, name="item_id")})
@MapKeyColumn(name="map_key")
@Column(name="filename", nullable=false)
private Map<String, String> mapImages = new HashMap<String, String>();
/**
*
*以一个组件的方式插入list中
*以组件作为collection类型,此时作为类型的组件应该@Embeddable标记
*private Collection<Image> list = new ArrayList<Image>();
*如果此处改为private List<Image> list = new ArrayList<Image>();
*则在组件所对应的表中,如果是复合主键,则需要让每一个主键都不能为空,如果其中有主键可以为空,那复合
*主键的意义就不存在了
*就如<bag></bag>和<idbag></idbag>标签类似,
*可以加入一个代理主键【@CollectionId】,这样就不必限制符合主键内每个都不能
*为空了,@CollectionId的generator属性不能为"native"
*/
@ElementCollection
@JoinTable(name="item_image", joinColumns= {@JoinColumn(nullable = false, name ="item_id")})
@CollectionId(columns={@Column(name="item_auto_id")}, type=@Type(type="long"), generator="nat")
private Collection<Image> list = new ArrayList<Image>();
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<String> getImages() {
return images;
}
public void setImages(Set<String> images) {
this.images = images;
}
public List<String> getListImages() {
return listImages;
}
public void setListImages(List<String> listImages) {
this.listImages = listImages;
}
public Map<String, String> getMapImages() {
return mapImages;
}
public void setMapImages(Map<String, String> mapImages) {
this.mapImages = mapImages;
}
public Collection<Image> getList() {
return list;
}
public void setList(Collection<Image> list) {
this.list = list;
}
}
Image.java
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class Image {
private String filename;
@Column(name="size_x")
private int sizeX;
@Column(name="size_y")
private int sizeY;
public boolean equals(Object obj) {
if (!(obj instanceof Image))
return false;
Image image = (Image) obj;
if ((image.getFilename().equals(this.getFilename()))
&& (image.sizeX == this.getSizeX())
&& image.getSizeY() == this.getSizeY()
)
return true;
else return false;
}
public int hashCode() {
// TODO Auto-generated method stub
return 0;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public int getSizeX() {
return sizeX;
}
public void setSizeX(int sizeX) {
this.sizeX = sizeX;
}
public int getSizeY() {
return sizeY;
}
public void setSizeY(int sizeY) {
this.sizeY = sizeY;
}
}
Test:
public class CollectionTest {
public static void main(String[] args) {
CollectionModel model = new CollectionModel();
model.setName("李四");
/*插入数据
// Set<String> set = new HashSet<String>();
// set.add("lisi -1");
// set.add("lisi -1");
// model.setImages(set);
// List<String> list = new ArrayList<String>();
// list.add("张三");
// list.add("李四");
// list.add("王五");
// model.setListImages(list);
*/
/**
* 针对map的测试类
*/
/*Map<String, String> map = new HashMap<String,String>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
model.setMapImages(map);
*/
List<Image> list =
new
ArrayList<Image>();
Image image =
new
Image();
image.setFilename(
"file1"
);
image.setSizeX(
20
);
image.setSizeY(
30
);
list.add(image);
image =
new
Image();
image.setFilename(
"file2"
);
image.setSizeX(
40
);
image.setSizeY(
50
);
list.add(image);
model.setList(list);
JPASessionFactory.persistenceObject(model);
}
}
描述:Ⅰ.Hibernate annotations 对包含值类型的集合映射支持非标准的注解. 对于值类型的对象不具备数据库的同一性,它属于一个实体的实例,值类型的类没有标识符或者标识属性,值类型的实例的生命周期由所依附的实体实例的生命周期所决定,且值类型的对象不支持共享引用。
最后
以上就是鳗鱼犀牛为你收集整理的JPA中的映射集合的全部内容,希望文章能够帮你解决JPA中的映射集合所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复