EJB3(中文版) 第九集 基本属性映射

2024-03-12 01:08

本文主要是介绍EJB3(中文版) 第九集 基本属性映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动画中用到的注释:
@Table注释
@javax.persistence.Table注释告诉EntityManager服务关系表映射成组件类,
你不需要详细指定这个注释,如果你不想映射,表名是无限制的组件类名.让我们看一下这个注释的完整定义:
package javax.persistence;
@Target({TYPE}) @Retention(RUNTIME)
public @interface Table
{
String name( ) default "";
String catalog( ) default "";
String schema( ) default "";
UniqueConstraint
uniqueConstraints( ) default {};
}
catalog( ) 和 schema( )属性是自省的,同样的它们识别有关表的catalog 和 schema属于:
public @interface UniqueConstraint
{
String[] columnNames( );
}
@Table.uniqueConstraints( )属性允许指定唯一的栏限制那将被包含在数据库定义语言(DDL)中,一些提供商的工具能够创建DDLs通过实体类集合,或自动表生成,当组件被部署时,UniqueConstraint注释非常的有用在使用特定提供商定义额外的约束时,如果你不使用schema生成工具,你不需要定义这片元数据.
@Table 和 @UniqueConstraint注释有一个等价的XML映射元素:
<table name="CUSTOMER_TABLE" catalog="TITAN" schema="TITAN">
<unique-constraint>
<column-name>SOME_OTHER_ATTRIBUTE</column_name>
</unique-constraint>
</table>
<table>元素是<entity>元素的子元素,如果你需要可以指定多个<unique-constraint>元素,一个唯一性约束可以包含多个栏,倒不如多个唯一性约束.

@Column注释
使用@Column注释,我们需要设置id属性的栏位名为CUST_ID并且是非空,数据库中的类型是integer.firstName属性,我们改变了栏位名和VARCHAR类型的长度映射成20.
@javax.persistence.Column注释描述详细的字段和属性信息映射到表中的指定栏:
public @interface Column
{
String name( ) default "";
boolean unique( ) default false;
boolean nullable( ) default true;
boolean insertable( ) default true;
boolean updatable( ) default true;
String columnDefinition( ) default "";
String table( ) default "";
int length( ) default 255;
int precision( ) default 0;
int scale( ) default 0;
}
name( )属性很明显的指定栏位名,如果你没有指定栏位名,栏位名默认的为字段或属性,table( )属性用来多表映射,在本章后将会介绍,其它的属性用来在厂商提供的工具自动生成Schema时使用.如果映射到一个已存在的schema,你不需要定义任何的这些属性,unique( ) and nullable( )属性定义约束在栏位上,你可以指定是否想要栏位被包含在SQL INSERT or UPDATE 使用 insertable( ) and updatable( ), 分别的.columnDefinition( )属性允许你定义准确的DDL来定义栏位类型,length( )属性确定VARCHAR类型的长度当有一个String类型的属性.
为了数值型属性你可以定义scale( ) 和precision( )属性.
@Column注释有一个等价的XML文件中的<column>元素,这个元素是属性映射类型<id>, <basic>, <temporal>, <lob>的子元素,<enumerated>元素的描述将会在本章后进行.
<basic name="lastName">
<column name=""
unique="true"
nullable="true"
insertable="true"
updatable="true"
column-definition=""
table=""
length=""
precision=""
scale=""
/>
</basic>
<column>元素的属性有相同和行为和默认值与@column注释.

@Id注释
@javax.persistence.Id注释标识一个或多个属性,来组成表中的主键:
package javax.persistence;

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Id
{
}
你可以通过手动或厂商提供的工具来生成主键,当你使用厂商提供的工具生成时你需要使用@javax.persistence.GeneratedValue,注释:
package javax.persistence;

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface GeneratedValue
{
GenerationType strategy( ) default AUTO;
String generator( ) default "";
}

public enum GenerationType
{
TABLE, SEQUENCE, IDENTITY, AUTO
}
持久化提供商要求提供键生成原始主键,你可以定义主键类型来生成通过strategy( )属性.GeneratorType.AUTO策略是一般的配置,AUTO策略告诉持久化提供者允许为你提供键.IDENTITY策略使用特殊栏类型,支持多种数据库,来建立主键.

@Basic注释
@Basic注释是最简单的映射形式对原持久化的属性来说.也是默认的属性映射类型是最原始的,原始的包装类型, java.lang.String, byte[], Byte[], char[], Character[], java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time , and java.sql.Timestamp.你不需要很明确的告诉持久化管理器映射成基本属性因为它通常计算出JDBC所使用的属性类型.

@Temporal注释(与时间相关的注释)
@Temporal注释提供额外的信息到持久化提供者关于映射java.util.Date 或 java.util.Calendar类型的属性.这个注释允许你映射这些种对象类型到一个日期,一个时间,或一个时间戳字段在数据库中.默认情况下,持久化提供者假定时间类型为一个时间戳,这个注释能够与@Basic注释联合使用.

@Lob注释
有时持久化属性需要很大的内存.字段中的一个代表一幅图片或一个非常大的文本.JDBC有特殊的类型与这些非常大的对象对应. java.sql.Blob类型代表二进制数据,和java.sql.Clob代表字符数据. @javax.persistence.Lob注释用来映射那些大的对象类型.JAVA持久化允许你映射一些基本类型到@Lob和持久化管理器处理他们内部的任一个Blob或Clob类型,依赖属性的类型:
package javax.persistence;

public @interface Lob
{
}
@Lob注释的属性持久化一个:
◆Blob 如果Java类型是byte[], Byte[], 或 java.io.Serializable
◆Clob如果Java类型是char[], Character[],或java.lang.String
@Lob注释常同@Basic注释联合使用提示属性将被延迟加载.让我们修改Customer组件来增加代表一个JPEG图象的属性.

@Enumerated 注释
@Enumerated注释映射Java枚举类型到数据库中.它与@Basic注释联合使用.

FetchType类型
public enum FetchType
{
LAZY, EAGER
}
通常,不需要在持久化属性上指明这个注释.可是,有时你需要详细指明fetch()属性,当持久化对象第一次从数据库中取出时你需要详细指明装载的属性是延迟的还是热切的.这个属性在查询数据时允许持久化提共者优化数据库的访问使用最小的数据量进行装载.所以,如果fetch()属性是LAZY时,详细属性将不被初始化直到实际访问到这个字段时.所有的其它注释有同样的属性.这种不自然的事情在规范中,尽管fetch()这个属性是一个提示,即使你标记了属性为LAZY的@Basic类型,持久化的提供者仍然允计装载属性为热切的.实际上这是预期的这种特性是类级的工具.它将同样的被著名那个延迟装载的即不真正的有用也不是一个重要的执行优化.事实上最好是热切的装入基本属性.

常见异常:
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
at $Proxy0.createCustomer(Unknown Source)
at com.lyh.ejb3.clients.Client.main(Client.java:38)
Caused by: java.rmi.MarshalException: Failed to communicate. Problem during marshalling/unmarshalling; nested exception is:
java.io.NotSerializableException: com.lyh.ejb3.domain.Customer
at org.jboss.remoting.transport.socket.SocketClientInvoker.transport(SocketClientInvoker.java:306)
at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:143)
at org.jboss.remoting.Client.invoke(Client.java:525)
at org.jboss.remoting.Client.invoke(Client.java:488)
at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:41)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)
at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:46)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)
at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:40)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)
at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:77)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88)
at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:102)
... 2 more
Caused by: java.io.NotSerializableException: com.lyh.ejb3.domain.Customer
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeArray(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.rmi.MarshalledObject.<init>(Unknown Source)
at org.jboss.aop.joinpoint.MethodInvocation.writeExternal(MethodInvocation.java:261)
at java.io.ObjectOutputStream.writeExternalData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.sendObject(JavaSerializationManager.java:81)
at org.jboss.remoting.marshal.serializable.SerializableMarshaller.write(SerializableMarshaller.java:84)
at org.jboss.remoting.transport.socket.SocketClientInvoker.transport(SocketClientInvoker.java:273)
... 14 more
解决方法:implements Serializable 实现序列化

我的联系方式:
QQ:495585885
Email:liuyuhui_007@yahoo.com.cn
我的博客:http://hi.baidu.com/vsandjava
与大家共同学习交流!

动画下载地址:

http://hi.baidu.com/vsandjava/blog/item/c1f99a16c109e851f2de32b1.html

这篇关于EJB3(中文版) 第九集 基本属性映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799677

相关文章

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Java继承映射的三种使用方法示例

《Java继承映射的三种使用方法示例》继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,:本文主要介绍Java继承映射的三种使用方法示例,需... 目录前言一、单表继承(Single Table Inheritance)1-1、原理1-2、使用方法1-

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁