`
finux
  • 浏览: 202488 次
  • 性别: 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批注

    - `@Column`:定义实体属性与数据库列的映射,可以设置列名、长度、是否允许为空等属性。 - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:定义实体之间的关联关系。 **JPA核心概念** 1. **实体...

    Toplink_JPA注解参考

    @Column(length = 50, nullable = false) private String name; // ... } ``` **5. 多对一/一对多注解 (@ManyToOne/@OneToMany)** 这些注解用于描述两个实体之间的关联关系。例如,一个部门有多个员工: ```...

    5.Hibernate 05 Hibernate结合JPA1

    JPA支持多种ORM实现,包括Hibernate、TopLink、OpenJPA等。 **2. JPA与Hibernate的关系** JPA是一个规范,而Hibernate是JPA的一个实现。这意味着你可以使用JPA的API来编写代码,而具体的数据访问逻辑则由Hibernate...

    JPA和Hibernate的关系

    1. **标准与实现**:JPA是一种标准,而Hibernate是一种实现了这一标准的框架。这意味着任何符合JPA规范的应用都可以无缝地与Hibernate集成。 2. **功能子集**:从功能的角度来看,JPA可以说是Hibernate的一部分...

    Spring2.5 + JPA(Hibernate)实现

    在压缩包“Spring_JPA_TopLink”中,TopLink是Oracle提供的一个JPA实现,但在本案例中,它可能是作为例子或对比出现,因为通常提到的是Spring与Hibernate的结合,而非Spring与TopLink。文件列表可能包含配置文件(如...

    Oracle Toplink JPA

    Oracle Toplink JPA

    JPA_官方文档_中文版

    目前,多个知名ORM框架如Hibernate、TopLink和OpenJPA提供了对JPA规范的实现,这意味着开发者可以选择最符合项目需求的工具,同时保持代码的可移植性和可维护性。JPA的出现不仅简化了对象持久化的工作,还促进了ORM...

    jpa toplink相关jar包,完整版。

    TopLink是Oracle公司开发的一个JPA实现,它为Java应用程序提供了强大的数据持久化能力。 在Java EE环境中使用JPA TopLink,你需要包含相关的jar包以支持TopLink作为JPA的提供者。这些jar包通常包含了TopLink的实体...

    尚硅谷 jpa

    - **JPA 实现者**:除了 Hibernate 外,还有其他几个实现 JPA 的工具,例如 TopLink 和 OpenJPA。 #### 三、JPA 的优势 - **标准化**:由于 JPA 提供了统一的 API,这意味着基于 JPA 开发的应用可以在不同的 JPA ...

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

    ### JSF+Spring+JPA(Hibernate实现)的环境搭建详解 #### 一、概述 在当前企业级应用开发中,技术栈的选择至关重要。本文旨在详细介绍如何构建基于JSF(JavaServer Faces)、Spring以及JPA(Java Persistence API,...

    JPA文档_学TOPLINK必看_PDF格式

    总的来说,JPA文档中的"学TOPLINK必看"部分,会详细阐述如何配置和使用JPA,如何将TOPLINK的特性与JPA相结合,以及如何通过这些工具解决实际开发中的问题。通过阅读《JPA_Basic.pdf》,你将能够深入了解JPA的基础...

    JPA参考文档 JPA参考文档

    ### JPA概述与关键技术 #### 一、JPA简介 JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM(Object-...随着更多框架(如Hibernate、TopLink等)实现了JPA规范,这一技术在未来还将持续发挥重要作用。

    JPA、hibernate项目常用包

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

    JPA 标注 JPA标签手册

    Java Persistence API (JPA) 是Java企业版5(Java EE 5)的一部分,与Enterprise JavaBeans(EJB)3.0规范一起,极大地简化了Java持久化。它提供了一种对象关系映射方法,允许您以标准、可移植的方式声明性地定义...

    jpa教程

    【JPA教程】Java Persistence API (JPA) 是Java EE 5.0引入的一个ORM(对象关系映射)规范,它的...目前,多个知名ORM框架如Hibernate、TopLink和OpenJPA都提供了对JPA的实现,这使得在不同项目间切换变得更为容易。

    s2sh s2sh项目 JPA项目 JPA+struts2+Hibernate+spring

    JPA可以与各种持久化供应商如Hibernate、TopLink等配合使用,本项目中JPA可能是与Hibernate一起使用,提供更高级别的数据访问抽象。 **项目结构与文件** 根据压缩包中唯一的文件名“Register_Spring_Hibernate_...

Global site tag (gtag.js) - Google Analytics