`
隐形的翅膀
  • 浏览: 483612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PlayFrameWork 注解

 
阅读更多
Play Framework框架 JPA常用注解
1、@Entity(name="EntityName")
必须 ,name 为可选 , 对应数据库中一的个表

2、@Table(name="",catalog="",schema="")
可选 , 通常和 @Entity 配合使用 , 只能标注在实体的 class 定义处 , 表示实体对应的数据库表的信息
name: 可选 , 表示表的名称 . 默认地 , 表名和实体名称一致 , 只有在不一致的情况下才需要指定表名
catalog: 可选 , 表示 Catalog 名称 , 默认为 Catalog("").
schema: 可选 , 表示 Schema 名称 , 默认为 Schema("").

3、@id
必须
@id 定义了映射到数据库表的主键的属性 , 一个实体只能有一个属性被映射为主键 . 置于 getXxxx() 前 .

4、@GeneratedValue(strategy=GenerationType,generator="")
可选
strategy: 表示主键生成策略 , 有 AUTO,INDENTITY,SEQUENCE 和 TABLE 4 种 , 分别表示让 ORM 框架自动选择 ,
根据数据库的 Identity 字段生成 , 根据数据库表的 Sequence 字段生成 , 以有根据一个额外的表生成主键 , 默认为 AUTO
generator: 表示主键生成器的名称 , 这个属性通常和 ORM 框架相关 , 例如 ,Hibernate 可以指定 uuid 等主键生成方式 .
示例 :
    @Id
    @GeneratedValues(strategy=StrategyType.SEQUENCE)
    public int getPk() {
       return pk;
    }

5、@Basic(fetch=FetchType,optional=true)
可选
@Basic 表示一个简单的属性到数据库表的字段的映射 , 对于没有任何标注的 getXxxx() 方法 , 默认即为 @Basic
fetch: 表示该属性的读取策略 , 有 EAGER 和 LAZY 两种 , 分别表示主支抓取和延迟加载 , 默认为 EAGER.
optional: 表示该属性是否允许为 null, 默认为 true
示例 :
    @Basic(optional=false)
    public String getAddress() {
       return address;
    }

6、@Column
可选
@Column 描述了数据库表中该字段的详细定义 , 这对于根据 JPA 注解生成数据库表结构的工具非常有作用 .
name: 表示数据库表中该字段的名称 , 默认情形属性名称一致
nullable: 表示该字段是否允许为 null, 默认为 true
unique: 表示该字段是否是唯一标识 , 默认为 false
length: 表示该字段的大小 , 仅对 String 类型的字段有效
insertable: 表示在 ORM 框架执行插入操作时 , 该字段是否应出现 INSETRT 语句中 , 默认为 true
updateable: 表示在 ORM 框架执行更新操作时 , 该字段是否应该出现在 UPDATE 语句中 , 默认为 true. 对于一经创建就不可以更改的字段 , 该属性非常有用 , 如对于 birthday 字段 .
columnDefinition: 表示该字段在数据库中的实际类型 . 通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型 , 但是对于 Date 类型仍无法确定数据库中字段类型究竟是 DATE,TIME 还是 TIMESTAMP. 此外 ,String 的默认映射类型为 VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOB 或 TEXT 字段类型 , 该属性非常有用 .
示例 :
    @Column(name="BIRTH",nullable="false",columnDefinition="DATE")
    public String getBithday() {
       return birthday;
    }

7、@Transient
可选
@Transient 表示该属性并非一个到数据库表的字段的映射 ,ORM 框架将忽略该属性 .
如果一个属性并非数据库表的字段映射 , 就务必将其标示为 @Transient, 否则 ,ORM 框架默认其注解为 @Basic
示例 :
    // 根据 birth 计算出 age 属性
    @Transient
    public int getAge() {
       return getYear(new Date()) - getYear(birth);
    }

8、@ManyToOne(fetch=FetchType,cascade=CascadeType )
可选
@ManyToOne 表示一个多对一的映射 , 该注解标注的属性通常是数据库表的外键
optional: 是否允许该字段为 null, 该属性应该根据数据库表的外键约束来确定 , 默认为 true
fetch: 表示抓取策略 , 默认为 FetchType.EAGER
cascade: 表示默认的级联操作策略 , 可以指定为 ALL,PERSIST,MERGE,REFRESH 和 REMOVE 中的若干组合 , 默认为无级联操作
targetEntity: 表示该属性关联的实体类型 . 该属性通常不必指定 ,ORM 框架根据属性类型自动判断 targetEntity.
示例 :
    // 订单 Order 和用户 User 是一个 ManyToOne 的关系
    // 在 Order 类中定义
    @ManyToOne()
    @JoinColumn(name="USER")
    public User getUser() {
       return user;
    }

9、@JoinColumn
可选
@JoinColumn 和 @Column 类似 , 介量描述的不是一个简单字段 , 而一一个关联字段 , 例如 . 描述一个 @ManyToOne 的字段 .
name: 该字段的名称 . 由于 @JoinColumn 描述的是一个关联字段 , 如 ManyToOne, 则默认的名称由其关联的实体决定 .
例如 , 实体 Order 有一个 user 属性来关联实体 User, 则 Order 的 user 属性为一个外键 ,
其默认的名称为实体 User 的名称 + 下划线 + 实体 User 的主键名称
示例 :
    见 @ManyToOne

10、@OneToMany(fetch=FetchType,cascade=CascadeType)
可选
@OneToMany 描述一个一对多的关联 , 该属性应该为集体类型 , 在数据库中并没有实际字段 .
fetch: 表示抓取策略 , 默认为 FetchType.LAZY, 因为关联的多个对象通常不必从数据库预先读取到内存
cascade: 表示级联操作策略 , 对于 OneToMany 类型的关联非常重要 , 通常该实体更新或删除时 , 其关联的实体也应当被更新或删除
例如 : 实体 User 和 Order 是 OneToMany 的关系 , 则实体 User 被删除时 , 其关联的实体 Order 也应该被全部删除
示例 :
    @OneTyMany(cascade=ALL)
    public List getOrders() {
       return orders;
    }

11、@OneToOne(fetch=FetchType,cascade=CascadeType)
可选
@OneToOne 描述一个一对一的关联
fetch: 表示抓取策略 , 默认为 FetchType.LAZY
cascade: 表示级联操作策略
示例 :
    @OneToOne(fetch=FetchType.LAZY)
    public Blog getBlog() {
       return blog;
    }

12、@ManyToMany
可选
@ManyToMany 描述一个多对多的关联 . 多对多关联上是两个一对多关联 , 但是在 ManyToMany 描述中 , 中间表是由 ORM 框架自动处理
targetEntity: 表示多对多关联的另一个实体类的全名 , 例如 :package.Book.class
mappedBy: 表示多对多关联的另一个实体类的对应集合属性名称
示例 :
    User 实体表示用户 ,Book 实体表示书籍 , 为了描述用户收藏的书籍 , 可以在 User 和 Book 之间建立 ManyToMany 关联
    @Entity
    public class User {
       private List books;
       @ManyToMany(targetEntity=package.Book.class)
       public List getBooks() {
           return books;
       }
       public void setBooks(List books) {
           this.books=books;
       }
    }
 
    @Entity
    public class Book {
       private List users;
       @ManyToMany(targetEntity=package.Users.class, mappedBy="books")
       public List getUsers() {
           return users;
       }
       public void setUsers(List users) {
           this.users=users;
       }
    }
两个实体间相互关联的属性必须标记为 @ManyToMany, 并相互指定 targetEntity 属性 ,
需要注意的是 , 有且只有一个实体的 @ManyToMany 注解需要指定 mappedBy 属性

13、@TransactionAttribute
事务管理服务
最有用的容器服务可能就是事务管理服务,当应用出现失败或异常时,它保证了数据库的完整性。你可以简单地将为一个 POJO 方法申明它的事务属性。这样容器就可以在合适的上下文中运行这个方法。最常见的事务是定义在 session bean 的方法上,方法中所有的数据库操作只有在方法正常退出时才会提交,如果方法抛出未捕获的异常,事务管理将回滚所有的变更。

14、@PersistenceContextType

当Play发现javax.persistence.Entity时, 会自动启动Hibernate entity manager

JPA entity manager is started you can get it from the application cod

Query query = JPA.em().createQuery("select * from Article");
    List<Article> articles = query.getResultList();
    render(articles);

事务管理。

Play will automatically manage transactions for you. It will start a transaction for each HTTP request and commit it when the HTTP response is sent. If your code throws an exception, the transaction will automatically rollback.

If you need to force transaction rollback from the application code, you can use the JPA.setRollbackOnly() method.

Find by ID

The simplest way to find an object.

Post aPost = Post.findById(5L);

Find all

List<Post> posts = Post.findAll();

This is the simplest way to retrieve all posts, but you can do the same using:

List<Post> posts = Post.all().fetch();

This allows you to paginate results:

List<Post> posts = Post.all().fetch(100); // 100 max posts

or even,

List<Post> posts = Post.all().from(50).fetch(100); // 100 max posts start at

#{if licData.daysBeforeExpired<=180 && licData.daysBeforeExpired>0}
<div class="common-note wornning" style="margin-top:13px;margin-bottom:16px;">
<p>
#{if licData.daysBeforeExpired>1}
&{'license.page.free.expiring',licData.daysBeforeExpired}
#{/if}
#{if licData.daysBeforeExpired<=1}
&{'license.page.free.expiring.1day',licData.daysBeforeExpired}
#{/if}
</p>
</div>
#{/if}

Query query = JPA.em().createQuery("select * from Article");
List<Article> articles = query.getResultList();
render(articles);

List<Post> posts = Post.all().from(50).fetch(100); // 100 max posts start at 50

Play应用开发者一开始可能经常会犯的错误是使用Hibernate的@Entity注解来取代JPA。这里请读者注意,Play是直接调用JPA的API来使用Hibernate。



EntityManager em = JPA.em();
em.persist(product);
em.createQuery("from Product where price > 50").getResultList();

Tomcat 多个APP共享数据库连接池
//looking up for the data source name registered in JNDI through Tomcat server.xml and context.xml files
DataSource ds = (DataSource) ctx.lookup(dsName);

  //找到驱动程序并注册
  Context initContext = new InitialContext();
  Context envContext = (Context) initContext.lookup("java:/comp/env");
  //取得数据源
  ds = (DataSource) envContext.lookup("jdbc/jlndb");
  //以下为另一种取得数据源的方式
  //ds = (DataSource) initContext.lookup("java:comp/env/jdbc/jlndb");
  //取得数据库连接
分享到:
评论

相关推荐

    play framework 框架手册 word 版

    框架id(framework ID) - 141 - 从命令行设置框架id - 142 - 22.生产部署 - 142 - application.conf - 142 - 设置框架为prod模式: - 142 - 定义一个真实的数据库: - 143 - 禁止JPA的自动结构更新: - 143 - 定义一...

    play框架手册

    框架id(framework ID) - 141 - 从命令行设置框架id - 142 - 22.生产部署 - 142 - application.conf - 142 - 设置框架为prod模式: - 142 - 定义一个真实的数据库: - 143 - 禁止JPA的自动结构更新: - 143 - 定义一...

    mar-sample-play-framework:演示如何在 MAR 容器中运行使用 Play Framework 2.3 生成的示例应用程序的示例

    托管应用程序运行时 - Play Framework 2.3 完整部署示例 这是一个完整的 Play Framework 服务器部署示例,使用 Activator 生成的 Qt 云服务示例应用程序 - 托管应用程序运行时(“ MAR ”)。 更多关于信息。 入门 ...

    paper-header-annotator-2:基于Fabric.js和Play Framework的纸张标题注释工具

    $ cd &lt;repos&gt;/playframework_temp/ $ &lt;activator&gt;/activator-dist-1.3.5/activator run 它应该编译必要的文件,然后在启动本地服务器。 依存关系 前端:矩形的。 后端:使用Java APIWeb应用程序的。 最终:用于...

    Spring In Action-2.1-01-@Component注解

    package soundsystem; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired;... sp.play(); } }

    Android代码-JApiDocs

    深度支持 Spring Boot, PlayFramework,JFinal,不需要额外声明路由。 支持一般的 Java Web 工程,需要在相关方法添加额外的路由。 支持接口声明过时(@Deprecated),方便的文档目录等。 支持自定义代码生成模板。 ...

    twixt:Play框架的替代形式绑定库

    Play Framework文档建议表格应由模型对象制成。 这样,在绑定期间将使用模型的验证注释。 虽然这对于简单的CRUD方案很有效,但在较大的应用程序中有其局限性: 表单可能只需要模型字段的子集。 绑定可能由于缺少@...

    SparkWeb:SparkWeb是一个超轻量级的Java Web MVC框架

    Sparkweb 是一个超轻量级的简易高效的 Java WEB 开发框架,其设计思想结合了目前主流的 Spring、Struts2、Playframework、Nodejs-Expressjs、Ruby On Rails 等框架的优秀地方,完美支持 RESTful设计。 二、Sparkweb ...

    port-scanner:使用 NMAP 扫描端口并在 mysql 数据库中保存历史记录的演示项目

    该项目是用 Java 7 编写的,使用 Play Framework v2.3.7 和 jQuery 前端,并在 Windows 上开发。 开发笔记 在我的 Windows 8 笔记本电脑上,当您尝试一次扫描两个或三个以上的主机时,我注意到 NMAP 存在问题。 我...

    swagger-play

    这是一个在控制器中支持Swagger注释的模块。 它基于库,并进行了一些改进。 该库使用Swagger 1.5和Play 2.7。 它可以用于基于Scala和Java的应用程序。 我们也希望将来支持Swagger 2.0,为此,我们将很高兴地为这一...

    dogstarrelay:Scrape dogstarradio.com的播放列表数据

    狗星接力这将搜索屏幕上的Sirius日程安排,并以更易于电子消费的格式... (目前已注释掉,因为它似乎无法在Heroku上运行,尽管它在其他情况下也很好用),表单提交,重定向,使用Ajax进行JavaScript路由,模板包含等。

    mjpeg-bluetooth-arduino-vehicle:自动从code.google.compmjpeg-bluetooth-arduino-vehicle导出

    简介该项目包含C#应用程序(需要.NET Framework 4.5或更高版本)的源代码,该源代码被编写为借助串行蓝牙连接来控制基于Arduino的车辆。 可以选择将MJPEG流媒体相机安装在车辆上(最简单的方法是将Android手机与...

    这是一篇有关 在线聊天系统 的系统报告书

    JSP is the current mainstream network programming language, in the modern enterprises in the development of web applications play an important role. This system is based on the actual needs of the ...

Global site tag (gtag.js) - Google Analytics