hibernate mapping的时候这value type 和 entity是很重要的概念
其区别我认为如下:
生命周期
- value type的生命周期是依赖于他所归属的对象的。比如user有一个property叫name,当一个用户删除之后他的名字也要同时删除,因为他的名字没有独自存在的意义。这里name就应该当作value type处理。他可以是java的内部的数据类型,比如String,也可以是一个类。当他是类的时候要标记这个类是user的一个component。
- entity都有自己的生命周期,不依赖于其他的对象。比如user有一个property叫school,当用户删除后,school还是存在的
database identifer
在数据库的层面上看
- value type没有自己的database identifier
- entity是有自己的identifier的
有待证实的问题:
根据在数据库的课程里学到的,我认为value type概念上其实是一个weak entity,但是weak entity是有自己的表的,不过他的主键是其依赖对象的主键和自己的一个id共同组成的,不知道hibernate如何处理这个问题的,jpa的annotation又该如何描述?
结论
做个一个有关map的实验,证实了确实是weak entity。
下面是一个entity的定义,里面有一个用Map实现的property
package test.jpa;
import java.util.Map;
import javax.persistence.*;
@Entity
@Table(name = "Metainfo")
public class Metainfo {
@Id @GeneratedValue
@Column(name="METAINFO_ID")
private Long id;
@org.hibernate.annotations.CollectionOfElements
@JoinTable(
name = "METAINFO_PROPERTIES",
joinColumns = @JoinColumn(name = "MATEINFO_ID")
)
@org.hibernate.annotations.MapKey(
columns = @Column(name = "PROPERY_NAME")
)
@Column(name = "PROPERTIES")
protected Map<String, String> propertyMap;
public Map<String, String> getPropertyMap() {
return propertyMap;
}
public void setPropertyMap(Map<String, String> propertyMap) {
this.propertyMap = propertyMap;
}
}
PRIMARY | PRIMARY | 0 | | | MATEINFO_ID | |
---|---|---|---|---|---|---|
PROPERY_NAME |