`
finux
  • 浏览: 200393 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

@Column length,区别TopLink与Hibernate的JPA实现

    博客分类:
  • Java
阅读更多

学习JPA时,一直用的是Oracle的TopLink实现。

对于@Column中的length,JPA官方是这样解释的

length   可选
默认值: 255

默认情况下,JPA 持续性提供程序假设所有列在用于保存 String 值时的最大长度为 255 个字符。

如果该列不适合于您的应用程序或数据库,请将 length 设置为适合于您的数据库列的 int 值。

 

TopLink中的实现好像并非以字符为单位,若length为255,TopLink在数据库的映射貌似是255个字节,并非Java里面String类型的255个字符。

 

不多说了,下面还是看看例子吧,这里的数据库为Oracle 10G XE。

 

实体类UserEO

package edu.dlut.entity;

import javax.persistence.*;

@Entity
@Table(name="t_user")
public class UserEO {
	private int id;
	private String name;
	
	@Id
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}

	@Column(length=3)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public UserEO() { }
}

如果在persistence.xml中加上这样一条

<property name="toplink.ddl-generation" value="create-tables" />

让TopLink自己去生成Table,结果如下

    create table "SCOTT"."T_USER"(
        "ID" NUMBER(10) not null,
       "NAME" VARCHAR2(3),
        constraint "SYS_C004185" primary key ("ID")
    );

    create unique index "SCOTT"."SYS_C004185" on "SCOTT"."T_USER2"("ID");

 

注意NAME字段,是VARCHAR(30),表示的是3个字节,而UserEO中name长度设为3,在Java当中表示3个字符。也就是说映射到Oracle数据库中去,若类型为VARCHAR2,那长度至少得为6个字节,即VARCHAR2(6)(实现是VARCHAR(12))。TopLink这样的实现,那么下面的Java代码显示是会报错的

package edu.dlut.entity.test;

import edu.dlut.entity.*;

public class UserEOTest {
	public static void main(String[] args) {
		UserEO user = new UserEO();
		user.setId(3);
		user.setName("周星星");
		
		EntityManagerHelper.beginTransaction();
		EntityManagerHelper.getEntityManager().persist(user);
		EntityManagerHelper.commit();
		EntityManagerHelper.closeEntityManager();
	}
}

在我这儿,异常如下

Internal Exception: java.sql.SQLException: ORA-12899: 列 "SCOTT"."T_USER"."NAME" 的值太大 (实际值: 9, 最大值: 3)
 

TopLink这样的结果,显然不是我们想要的。

 

同样的实体类UserEO,我们用Hibernate去生成Table,结果却是这样

    create table "SCOTT"."T_USER"(
        "ID" NUMBER(10) not null,
       "NAME" VARCHAR2(12),
        constraint "SYS_C004183" primary key ("ID")
    );

    create unique index "SCOTT"."SYS_C004183" on "SCOTT"."T_USER"("ID");

这样的结果, 却正是我们需要的,而之前想要插入的"周星星",定是会成功的。但是如果插入"javae",却不能成功。

这样好像在一定的程序上证明Hibernate的JPA实现中,@Column中的length,正好是与Java中String类型的length()方法得结果是相等的。而TopLink的实现,似乎不是我们想要的结果。

分享到:
评论
1 楼 goodnight 2009-03-25  
一般我在不同的数据库使用JPA的时候,遇到我自己不确定的Column的生成类型,我会使用columnDefinition来明确生成的类型。例如:
@Column(columnDefinition="varchar2(6)")
private String name;

确是存在不同的数据库生成的类型不同这种情况。

相关推荐

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    Toplink_JPA注解参考

    toplink jpa的中文注解参考,虽然老了一点基本上还是很有用的。 原来下载的一个兄弟的chm,里面的锚链接有问题,反编译后修改了链接,并且保留html格式,使用更方便。

    Oracle Toplink JPA

    Oracle Toplink JPA

    JPA、hibernate项目常用包

    现在引入了一组全新的 API:Java Persistence API JPA 以允许开发者管理 Java EE(甚至 SE)应用程序中的关系数据 另外 Sun 声称 Java Persistence API 表现了一些 Hibernate TopLink(二者都会在稍后讨论) JDO ...

    jpa toplink相关jar包,完整版。

    javaee实现jpa的toplink相关jar包。完整版。

    JSF+Spring+JPA(Hibernate实现)的环境搭建

    JSF+Spring+JPA以我个人看来,应该说是Struts2+Spring+Hibernate的替代解决方案。 引入JPA去取代或者说包装或者说是升级Hibernate是为了符合JAVA EE的规范,达到ORM统一的结果。下次项目用EJB也好、用TOPLINK也好、...

    黎活明老师讲解的JPA源码

    JPA必将成为Java持久化解决方案的主流,如果你是Hibernate或者TopLink的等ORM技术的忠实用户,不管你是否情愿,你迟早也得使用JPA,那现在正好可以借助传智播客视频教程的帮助,开始学习和尝试JPA吧!

    JPA+批注参考.pdf

    JPA(java persistence api)是JavaEE5.0平台的标准的ORM规范。而Hibernate、TopLink和OpenJPA为JPA的一种实现方式。 本文档主要是对其注解的详细说明。

    myeclipse_jpa_toplink.swf

    myeclipse_jpa_toplink.swf

    JPA文档_学TOPLINK必看_PDF格式

    JPA文档_学TOPLINK必看_PDF格式

    JPA持久化简介

    Hibernate、iBATIS、TopLink、Castor JDO、Apache OJB等这么多持久层框架,你还在为学习上面那个框架而苦恼吗?你还为研究下一代是那个而头疼吗? 朋友,学习JPA吧!JPA的出现就是解决您上面的苦恼的。

    JPA 注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML...JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致 同时JPA也是JavaEE5 (EJB) 3.0 规范的组成部分。 这个文档是针对JPA常用注解的一些说明。

    JPA注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述...JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致 同时JPA也是JavaEE5 (EJB) 3.0 规范的组成部分。 这个文档是针对JPA常用注解的一些说明。

    用JPA时需要的jar包

    JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化...目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。

    ejb3.0 jpa

    JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历,在充分...目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。

    Getting Started with JPA

    Even though proprietary mapping products like Hibernate and TopLink still exist, they are now focused on providing their functionality through the JPA API, allowing all applications to be portable ...

    Pro JPA 2 Mastering the Java Persistence API free down

    要是你对 Hibernate 或 TopLink 的 Criteria API 不熟悉的话,可以将它想像成一个以 Java 为中心的面向对象,线程安全并可以与 JPQL 划上等号的一组 API .这组 API 适合于编写复杂的动态查询语句,还可避免解析 JPQL...

    Spring Boot Jpa.docx

    值得注意的是,Jpa是在充分吸收了现有 Hibernate,TopLink,JDO 等 ORM 框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,Jpa 受到了极大的支持和赞扬,其中就包括了 Spring 与 ...

    JPA-eclipselink-project:使用 EclipseLink 实现的 JPA 项目示例

    这个 API 有不同的实现:EclipseLik、Hibernate、TopLink、OpenJPA、...... API 提供类似于 SQL 的查询语言,但使用对象而不是数据库中的关系实体。 Java Persistence API 基于实体,这些实体是简单的带注释的 POJO...

Global site tag (gtag.js) - Google Analytics