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 可以定义一个或者多个持久化单元,持久化单元必须有唯一的名字。
来源:oschina
链接:https://my.oschina.net/u/3018126/blog/3163799