学习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的实现,似乎不是我们想要的结果。
分享到:
相关推荐
- `@Column`:定义实体属性与数据库列的映射,可以设置列名、长度、是否允许为空等属性。 - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:定义实体之间的关联关系。 **JPA核心概念** 1. **实体...
@Column(length = 50, nullable = false) private String name; // ... } ``` **5. 多对一/一对多注解 (@ManyToOne/@OneToMany)** 这些注解用于描述两个实体之间的关联关系。例如,一个部门有多个员工: ```...
JPA支持多种ORM实现,包括Hibernate、TopLink、OpenJPA等。 **2. JPA与Hibernate的关系** JPA是一个规范,而Hibernate是JPA的一个实现。这意味着你可以使用JPA的API来编写代码,而具体的数据访问逻辑则由Hibernate...
1. **标准与实现**:JPA是一种标准,而Hibernate是一种实现了这一标准的框架。这意味着任何符合JPA规范的应用都可以无缝地与Hibernate集成。 2. **功能子集**:从功能的角度来看,JPA可以说是Hibernate的一部分...
在压缩包“Spring_JPA_TopLink”中,TopLink是Oracle提供的一个JPA实现,但在本案例中,它可能是作为例子或对比出现,因为通常提到的是Spring与Hibernate的结合,而非Spring与TopLink。文件列表可能包含配置文件(如...
Oracle Toplink JPA
目前,多个知名ORM框架如Hibernate、TopLink和OpenJPA提供了对JPA规范的实现,这意味着开发者可以选择最符合项目需求的工具,同时保持代码的可移植性和可维护性。JPA的出现不仅简化了对象持久化的工作,还促进了ORM...
TopLink是Oracle公司开发的一个JPA实现,它为Java应用程序提供了强大的数据持久化能力。 在Java EE环境中使用JPA TopLink,你需要包含相关的jar包以支持TopLink作为JPA的提供者。这些jar包通常包含了TopLink的实体...
- **JPA 实现者**:除了 Hibernate 外,还有其他几个实现 JPA 的工具,例如 TopLink 和 OpenJPA。 #### 三、JPA 的优势 - **标准化**:由于 JPA 提供了统一的 API,这意味着基于 JPA 开发的应用可以在不同的 JPA ...
### JSF+Spring+JPA(Hibernate实现)的环境搭建详解 #### 一、概述 在当前企业级应用开发中,技术栈的选择至关重要。本文旨在详细介绍如何构建基于JSF(JavaServer Faces)、Spring以及JPA(Java Persistence API,...
总的来说,JPA文档中的"学TOPLINK必看"部分,会详细阐述如何配置和使用JPA,如何将TOPLINK的特性与JPA相结合,以及如何通过这些工具解决实际开发中的问题。通过阅读《JPA_Basic.pdf》,你将能够深入了解JPA的基础...
### JPA概述与关键技术 #### 一、JPA简介 JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM(Object-...随着更多框架(如Hibernate、TopLink等)实现了JPA规范,这一技术在未来还将持续发挥重要作用。
现在引入了一组全新的 API:Java Persistence API JPA 以允许开发者管理 Java EE(甚至 SE)应用程序中的关系数据 另外 Sun 声称 Java Persistence API 表现了一些 Hibernate TopLink(二者都会在稍后讨论) JDO ...
Java Persistence API (JPA) 是Java企业版5(Java EE 5)的一部分,与Enterprise JavaBeans(EJB)3.0规范一起,极大地简化了Java持久化。它提供了一种对象关系映射方法,允许您以标准、可移植的方式声明性地定义...
【JPA教程】Java Persistence API (JPA) 是Java EE 5.0引入的一个ORM(对象关系映射)规范,它的...目前,多个知名ORM框架如Hibernate、TopLink和OpenJPA都提供了对JPA的实现,这使得在不同项目间切换变得更为容易。
JPA可以与各种持久化供应商如Hibernate、TopLink等配合使用,本项目中JPA可能是与Hibernate一起使用,提供更高级别的数据访问抽象。 **项目结构与文件** 根据压缩包中唯一的文件名“Register_Spring_Hibernate_...