JPA官方文档 笔记

感情迁移 提交于 2020-02-28 04:23:02

1、注解在字段上是持久化字段,注解在get方法上是持久化属性

2、主键、联合主键;联合主键可以建一个联合主键类,或者标注多个字段为联合主键

3、关系分双向关系,和单向关系。  @OneToOne、@OneToMany或@manytomy注释的mappedBy元素来引用其所属的一面。mappedBy元素指定实体中作为关系所有者的属性或字段。

多对一双向关系的多方面不能定义mappedBy元素。多方面总是关系的拥有方。

对于一对一的双向关系,拥有方对应于包含相应外键的方。

对于多对多的双向关系,任何一方都可能是拥有方。

4、在多对多中 一般关系拥有方,设置@JoinTable    例如:

@JoinTable( name =“ EJB_ROSTER_TEAM_PLAYER”, joinColumns = @JoinColumn(name =“ TEAM_ID”,referencedColumnName =“ ID”), inverseJoinColumns = @JoinColumn(name =“ PLAYER_ID”,referencedColumnName =“ ID”) )

反方则需要设置 mappedBy

5、继承映射,多态映射,   一个抽象类,也可以被标注@Entity,与非抽象类不同的仅仅只是不能生成实例对象,

一个抽象类,作为父类,被两个子类继承    @Inheritance注解有三种策略,

第一种,(strategy = InheritanceType.Joined )  父表,子表分别创建,子表不继承父表的字段,而是以外键的形式链接一个父表的记录。

第二种 (strategy = InheritanceType.SINGLE_TABLE  )则父表及所有子表的所有字段全部被创建在一张表里。

第三种  (strategy = InheritanceType.TABLE_PER_CLASS)则不创建父表,将父表中的字段赋予子表,只单独建立不同的子表。

@DiscriminatorColumn
只能用在@Inheritance( strategy=InheritanceType.SINGLE_TABLE或JOINED下)   用法如下:

用途:hibernate映射时,采用主从表关联形式映射,父类代表主表,子类注解代表将向主表插入数据库的数据值

父类
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=“a_type”, discriminatorType=DiscriminatorType.STRING, length=30)
子类
@DiscriminatorValue(“我是值”)
表中有一列a_type,类型为字符串,长度30,操作插入的值为“我是值”
 

抽象实体可以像普通实体查询一样进行查询。如果一个抽象实体是一个查询的目标,则查询操作将会查询抽象实体的所有具体子类。

6、实体类可以继承非实体类,但实例继承自非实体父类中的所有属性都将忽略,也无法查询。

如果将父类标注为@MappedSuperclass,虽然该父类不会被映射为表,但是其所有子类实体都将继承该父类的属性。

7、EntityManager 、EntityManagerFactory

@PersistenceContext
EntityManager em;
@PersistenceUnit
EntityManagerFactory emf;
EntityManager em = emf.createEntityManager();

8、持久化状态

新建状态实例没有持久性标识,并且尚未与持久性上下文关联。

托管实体实例具有持久标识,并与持久性上下文关联。

游离的实体实例具有持久标识,并且当前未与持久上下文关联。

删除态实体实例具有永久标识,与永久上下文关联,并计划从数据存储中移除。

新建实体——》托管态 == ( persist() 方法  or  cascade = persist    or   cascade = all  )    对游离态的实体执行persist() 将抛出 IllegalArgumentException

对 删除态的的实体执行persist() 会将实体变成托管态

托管态——》删除态 ==(remove() 方法  or  cascade = remove  or  cascade = all) 对删除态 ,新建状态 实体执行remove()操作将被忽略,对游离态实体执行remove()将抛出 IllegalArgumentException

托管态的实体,在事务被提交的时候会同步自身的状态,同时也会同步与该实体有级联关系的实体,根据级联关系的配置。flush方法将强制同步,同时也将会同步级联关系的实体。

9、查询    createQuery  和  createNamedQuery  

public List findWithName(String name) {
return em.createQuery(
    "SELECT c FROM Customer c WHERE c.name LIKE :custName")
    .setParameter("custName", name)
    .setMaxResults(10)
    .getResultList();
}
@NamedQuery(
    name="findAllCustomersWithName",
    query="SELECT c FROM Customer c WHERE c.name LIKE :custName"
)
@PersistenceContext
public EntityManager em;
...
customers = em.createNamedQuery("findAllCustomersWithName")
    .setParameter("custName", "Smith")
    .getResultList();

10、named parameter  和  position parameter ;   named用 " : name "   ,  position用 "?1"

11、持久化单元定义一组由应用程序中的EntityManager实例管理的所有实体类。这组实体类表示单个数据存储中包含的数据。

持久化单元由Persistence.xml配置文件定义。其META-INF目录包含persistence.xml的JAR文件或目录称为持久化单元的根目录。持久化单元的范围由持久化单元的根决定。  通常persistence.xml文件放在 WEB-INF/classes/META-INF   中。  一个persistence.xml 可以定义一个或者多个持久化单元,持久化单元必须有唯一的名字。           

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!