JPA实体设计

实体是轻量级的领域对象,因此实体也称为领域模型。

既然属于模型,那么模型应该遵守一些设计规范,设计实体的时候应该注意哪些规范呢?

实体是属于领域模型,那么实体这个模型在多层软件架构中属于那一层呢?

 

多层架构程序

我们首先用一张图来说明实体在多层软件架构中属于那一层?

Domain model in a Multilayer architecture

在一个多层软件架构中,领域模型能够被每一个组件访问。DAO层(Repository)用它来管理数据,展示层(Controller)

用它来将数据转化成JSON,便于前端展示等等。一个问题,Service层用领域模型来做什么呢?

一个重要的原则:

设计实体(领域模型)的时候最重要的是不要以来任何正交的Java API,举例来说,领域模型不应执行数据库操作和JNDI查找。实体(领域模型)最好设计成简单的POJO

 

设计实体基本原则

  1. 实体类必须用@Entity注解标注
  2. 实体类必须有一个public或者protected的无参构造器,也可以有其他构造器
  3. 实体类必须是顶级类,枚举或者接口不能设计成实体
  4. 抽象类和具体类都可以设计成实体
  5. 实体类不能设计成final.实体类的任何方法或者持久化变量都不能是final
  6. 建议实体类实现序列化接口,尽管不是必须的
  7. 每一个private或protected属性应该设计Getter/Setter方法
  8. 实体类支持继承,多态关联和多态查询
  9. 可以为实体类增加验证功能

好了,请问有什么疑问吗?这里我先提供一些疑问?

是否每个实体属性都需要设计Getter/Setter方法?

实体怎么支持多态查询和多态关联?

什么叫做顶级类?

 

设计实体属性原则

 

每一个持久化的属性需要设置setter/getter方法

如果属性需要容器,使用集合接口,而不是具体的实现类

JPA支持的一些属性数据类型:

The persistent fields an entity may be of the following types: Java primitive types & their wrapper class, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[], Character[], java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime, java.time.OffsetDateTime, and user-defined types that implement the Serializable interface, enums, entity types, collections of entity types, embeddable classes, collections of basic and embeddable types.

Avoid using java.util.Date. Instead use the classes from java.time.*, such as java.time.LocalDate, java.time.LocalTime, and etc.

这里遇到一个问题,给实体设置时间属性的时候,最好不要用java.util.Date.推荐使用java.time.*至于原因嘛,后续我们会按照上面的注解进行慢慢分析。

 

实体注解类型

注解属于实体的元数据,基本的注解类型包括属性注解,关系注解,嵌入注解等。比如@Entity , @Table 等,我们后续的学习就是通过使用注解来提高对JPA的认识。

版权声明:著作权归作者所有。

相关推荐

JPA实体状态学习-(游离态:Detached)

今天我们学习另一种实体状态,老规矩还是先上图:Detached(游离态 unmanaged)An Object becomes detached when the currently running Persistence Context is closed. Any changes made to detached objects are no longer automatically prop

JPA实体状态学习-(瞬时态:Transient)

为了学习实体的状态,我们还是贴出这张实体状态转换迁移图:Transient(瞬时态)按照上图的描述,java对象在内存中被赋值后,没有调用entityManager.persist()方法之前实体对象所处的状态。举个例子:Teacher teacher = new Teacher("email@dot.com");此时,实例teacher就处于new/transient态(备注:这里的new和tr

JPA实体状态学习-(持久态:Persistent)

今天我们继续学习JPA的实体状态转化,老规矩贴上实体转化的转化图: 上一节我们学习了:entityManager调用persist()方法后,实体的状态从transient到persistent,这个时候对persistent状态的实体改变也会同步持久化到数据库,执行tx.commit()之后实体进入detached状态,此时对实体进行改变后不会同步到数据库。今天我们来看看transie

JPA实体状态深入理解

我们在学习JPA实体状态的时候,常常会问,JPA的实体有多少状态呢?相信这个问题不难回答:瞬时态(transient)托管态(persistent)游离态(detached)移除态(removed)注意:这里最后一个移除态,有的时候也叫删除态(deleted),至于它和移除态有啥区别,暂时没有想到,如果您对此有更加深刻的理解,请留言回复。为什么会有这四种状态呢?啥,这个也有为啥,网上不是都这么说的

CSS设置placeholder字体样式

CSS标准里是没有直接对placeholder设置样式的选择器,这里主要是通过各个浏览器的兼容前缀来给输入框的placeholder设置字体样式。/* WebKit browsers*/  input::-webkit-input-placeholder {    color:#999;     font-s

[译]Android UI设计与样式——dp和sp

朋友们,最近我一直在做一些Android UI设计和样式的培训课程。 我想和更多观众分享。 这是我的第一个android ui设计和样式教程。 我将在这个主题上写更多的内容。 那么现在开始吧...DP, SP & Pixels作为Android开发人员,我们始终希望我们的UI设计与设备无关。