Hibernate注解(二)之映射简单的属性

翻译自   Hibernate Annotations

2.  映射简单的属性

2.1.声明基本的属性映射

        每个非静态非瞬态属性(取决于访问类型的字段或方法)都被认为是持久性的,除非您将其注释为@Transient。没有为您的财产注释等同于适当的 @Basic注释。该@Basic 注释允许您声明属性的获取策略:

public transient int counter; //transient propertyprivate String firstname; //persistent property@Transient
String getLengthInMeter() { ... } //transient propertyString getName() {... } // persistent property@Basic
int getLength() { ... } // persistent property@Basic(fetch = FetchType.LAZY)
String getDetailedComment() { ... } // persistent property@Temporal(TemporalType.TIME)
java.util.Date getDepartureTime() { ... } // persistent property           @Enumerated(EnumType.STRING)
Starred getNote() { ... } //enum persisted as String in database

        counter,一个瞬时字段,以及 lengthInMeter注释为@Transient实体管理器并且将被实体管理器忽略的方法 。name,length和 firstname属性被映射为持久且急切地获取(简单属性的默认值)。在 detailedComment一次实体的懒属性是第一次访问属性值将延迟访从数据库中。通常你不需要懒惰的简单属性(不要与懒惰的关联抓取相混淆)。

注意:

        为了启用属性级别的延迟获取,必须对类进行检测:将字节码添加到原始类中以启用此类功能,请参阅Hibernate参考文档。如果你的类没有插装,属性级别的延迟加载会被忽略。

        推荐的替代方法是使用JP-QL(Java持久性查询语言)或Criteria查询的投影功能。
        JPA支持Hibernate支持的所有基本类型(所有基本Java类型,它们各自的包装器和可序列化类)的属性映射。Hibernate Annotations支持开箱枚举类型映射到有序列(保存枚举序列)或基于字符串的列(保存枚举字符串表示形式):默认为序号的        持久性表示可以通过@Enumerated 注释覆盖,如图所示在note属性的例子。
        在普通的Java API中,时间的时间精度没有被定义。在处理时态数据时,您可能想要描述数据库中的预期精度。时间数据可以具有 DATE,TIME或 TIMESTAMP精确(即实际日期,只有时间或两者)。使用@Temporal注释来微调。
        @Lob表示该属性应该以斑点或者根据属性类型的Clob被保留: java.sql.Clob, Character[],char[]和的java.lang。String将坚持在Clob。 java.sql.Blob,Byte[], byte[] 和序列化的类型将被在一个斑点持续存在。

@ Lob 
public String  getFullText (){ return  fullText ; }  @ Lob public byte []  getFullCode (){ return  fullCode ; } 
    如果属性类型实现 java.io.Serializable并且不是基本类型,并且该属性未被注释@Lob,则使用Hibernate serializable类型。


2.2.访问类型

       默认情况下,类层次结构的访问类型由@Id或 @EmbeddedId注释的位置定义。如果这些注释位于一个字段上,那么只有字段被认为是持久性的,并且状态通过该字段被访问。如果注释位于getter上,那么只有getter被认为是持久性的,并且通过getter / setter来访问状态。这在实践中效果很好,并且是推荐的方法。

注意

        注解在类层次结构中的放置必须一致(字段或属性)才能确定默认访问类型。建议在整个应用程序中坚持使用单个注释放置策略。


但是在某些情况下,您需要:

  • 强制实体层次结构的访问类型
  • 覆盖类层次结构中特定实体的访问类型
  • 覆盖可嵌入类型的访问类型
最好的用例是可能不使用相同访问类型的几个实体使用的可嵌入类。在这种情况下,最好在可嵌入类级别强制访问类型。
要强制给定类的访问类型,请使用@Access如下所示的 注释:
@Entity
public class Order {@Id private Long id;public Long getId() { return id; }public void setId(Long id) { this.id = id; }@Embedded private Address address;public Address getAddress() { return address; }public void setAddress() { this.address = address; }
}@Entity
public class User {private Long id;@Id public Long getId() { return id; }public void setId(Long id) { this.id = id; }private Address address;@Embedded public Address getAddress() { return address; }public void setAddress() { this.address = address; }
}@Embeddable
@Access(AcessType.PROPERTY)
public class Address {private String street1;public String getStreet1() { return street1; }public void setStreet1() { this.street1 = street1; }private hashCode; //not persistent
}

您还可以覆盖单个属性的访问类型,同时保持其他属性的标准。

@Entity
public class Order {@Id private Long id;public Long getId() { return id; }public void setId(Long id) { this.id = id; }@Transient private String userId;@Transient private String orderId;@Access(AccessType.PROPERTY)public String getOrderNumber() { return userId + ":" + orderId; }public void setOrderNumber() { this.userId = ...; this.orderId = ...; }
}

在此示例中,默认访问类型 FIELD除 orderNumber属性外。请注意,相应的字段(如果有)必须标记为@Transient或 transient。

@ org.hibernate.annotations.AccessType
@org.hibernate.annotations.AccessType对于FIELD和PROPERTY访问,该注释 应被视为弃用。但是,如果您需要使用自定义访问类型,它仍然很有用。


2.3.  声明列属性

可以使用@Column注释来定义用于属性映射的列。使用它来覆盖默认值(有关默认值的更多信息,请参阅EJB3规范)。您可以在属性级别对此属性使用此注释:

  • 根本没有注释
  • 注释 @Basic
  • 注释 @Version
  • 注释 @Lob
  • 注释 @Temporal
@Entity
public class Flight implements Serializable {
...
@Column(updatable = false, name = "flight_name", nullable = false, length=50)
public String getName() { ... }
该name属性映射到flight_name不可空的 列,长度为50,不可更新(使属性不可变)。
该注释可以应用于常规的性质以及 @Id或@Version 性质。
@Column(name="colu(1)mnName";boolean un(2)ique() default false;boolean nu(3)llable() default true;boolean in(4)sertable() default true;boolean up(5)datable() default true;String col(6)umnDefinition() default "";String tab(7)le() default "";int length(8)() default 255;int precis(9)ion() default 0; // decimal precisionint scale((10)) default 0; // decimal scale

name (可选):列名称(默认为属性名称)
unique (可选):是否在此列上设置唯一约束(默认为false)
nullable (可选):将列设置为可空(默认为true)。
insertable (可选):列是否将成为插入语句的一部分(默认为true)
updatable (可选):列是否将成为更新语句的一部分(默认为true)
columnDefinition (可选):覆盖此特定列的sql DDL片段(非便携式)
table (可选):定义目标表(默认主表)
length (可选):列长度(默认值为255)
precision (可选):列小数精度(默认值为0)
scale (可选):十进制小数点(如果有用的话)(默认值为0)


2.4.  嵌入式对象(又名组件)

    可以在实体内部声明一个嵌入式组件,甚至可以覆盖它的列映射。组件类必须用注解在类级别进行@Embeddable 注释。可以使用 相关属性中的@Embedded和@AttributeOverride注释来覆盖特定实体的嵌入对象的列映射 :

@Entity
public class Person implements Serializable {// Persistent component using defaultsAddress homeAddress;@Embedded@AttributeOverrides( {@AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),@AttributeOverride(name="name", column = @Column(name="bornCountryName") )} )Country bornIn;...
}   
@Embeddable
public class Address implements Serializable {String city;Country nationality; //no overriding here
} 
@Embeddable
public class Country implements Serializable {private String iso2;@Column(name="countryName") private String name;public String getIso2() { return iso2; }public void setIso2(String iso2) { this.iso2 = iso2; }public String getName() { return name; }public void setName(String name) { this.name = name; }...
}  
        可嵌入对象继承其拥有实体的访问类型(请注意,您可以使用@Access注释覆盖该类型 )。
       该Person实体具有两个组件属性,homeAddress并且 bornIn。homeAddress属性没有被注解,但Hibernate会通过@Embeddable在Address类中查找注释来猜测它是一个持久组件。我们还覆盖列名的映射(以bornCountryName与所述) @Embedded和@AttributeOverride 注解的每个映射属性 Country。正如你所看到的,Country 它也是一个嵌套的组件Address,同样使用Hibernate和JPA默认的自动检测。覆盖嵌入对象嵌入对象的列是通过虚线表达式。
    @Embedded@AttributeOverrides( {@AttributeOverride(name="city", column = @Column(name="fld_city") ),@AttributeOverride(name="nationality.iso2", column = @Column(name="nat_Iso2") ),@AttributeOverride(name="nationality.name", column = @Column(name="nat_CountryName") )//nationality columns in homeAddress are overridden} )Address homeAddress;
        Hibernate Annotations支持JPA规范没有明确支持的东西。您可以使用注释对嵌入对象进行@MappedSuperclass注释,以使超类属性保持不变(请参阅 @MappedSuperclass以获取更多信息)。
        您还可以使用关联标注在嵌入对象(即@OneToOne,@ManyToOne, @OneToMany或@ManyToMany)。覆盖您可以使用的关联列 @AssociationOverride。
        如果您希望在同一实体中具有相同的可嵌入对象类型两次,则列名默认将不起作用,因为多个嵌入对象将共享同一组列。在普通的JPA中,您需要覆盖至少一组列。然而,Hibernate允许你通过NamingStrategy界面增强默认的命名机制 。你可以写一个策略来防止名称在这种情况下发生冲突。 DefaultComponentSafeNamingStrategy就是这样一个例子。


2.5.未注释的属性默认值

如果一个财产没有注释,则适用下列规则:

  • 如果该属性属于单一类型,则将其映射为@Basic
  • 否则,如果该属性的类型被注释为@Embeddable,则它被映射为@Embedded
  • 否则,如果该属性的类型是 Serializable,则将其映射为 @Basic保存该序列化版本中的对象的列
  • 否则,如果该属性的类型是 java.sql.Clob或 java.sql.Blob,则将其映射为 @Lob适当的 LobType



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程与服务的签名_苹果app签名需要注意哪几点

现在部分的智能手机系统设备和工作一个应用软件,都需求证书的签名认证。未经任何签名的程序是不能在智能手机上设备和工作的。验证签名的底子进程则:智能手机操作系统或软件渠道对收到的原始数据选用相同的杂凑运算得到消息摘要,将与被签署时分的消息摘要…

8.4-中断系统

【README】 1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 2.采用一问一答的方式对中断进行总结(中断7问题),refer2 8.4-中断系统小结&…

ASP.NET Core的配置(1):读取配置信息

提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中。到了.NET Core的时候,很多我们…

EL调用java方法

一、jstl函数 jstl函数自定义二、调用方法的值成变量 第一种使用request对象 <% request.setAttribute(“isOperate”,isShowOperate()); %> 第二种使用标签变量 <c:set var"isOperate" value"<%isShowOperate()%>" />转换成变量使用<…

wordcloud python3.7_[原创]win7/64位系统+python3.7.2下安装wordcloud库失败之解决——一个莫名其妙的方法...

当前环境&#xff1a;win7/64位系统python3.7.2pip-19.2.1使用pip install wordcould安装时出现错误&#xff0c;提示&#xff1a;尝试方法①&#xff1a;考虑更换其他安装源提示没有变化&#xff0c;仍然提示没有找到分发版本-----------强行插入的分割线-------------------(…

1-计算机系统概论

【README】 本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1.1】计算机软硬件概念 【1.2】计算机层次结构 【2】计算机基本组成 【2.1】冯诺依曼计算机特点&#xff08;重要*&#…

JetBrains 加入 .NET 基金会

在 BUILD 大会上&#xff0c;微软正式对外宣布&#xff0c;JetBrains 已经加入 .NET 基金会&#xff0c;详细情况可以查看 .NET Foundation 博客。 JetBrains 因为用户推荐、ReSharpe、ReSharper Ultimate 套件等原因&#xff0c;在 .NET 平台投入大量资源。而现在&#xff0c…

jstl中添加自定义的函数

转载自 jstl中添加自定义的函数由于jstl中提供的函数未必能够满足我们的要求&#xff0c;而我们又希望能够像jstl提供的函数那样能够轻松方便使用&#xff0c;那么可以通过自定义函数补充jsltl函数。给jstl添加自定义函数需要以下步骤&#xff1a;定义一个static的public的方…

多智能体强化学习_基于多智能体强化学习主宰星际争霸游戏

大家好&#xff0c;今天我们来介绍基于多智能体强化学习主宰星际争霸游戏这篇论文Grandmaster level in StarCraft II using multi-agent reinforcement learning​doi.org从Alphastar以后 利用强化学习的方法进行星际争霸2AI的又一大突破。Part1 前言游戏介绍(Introduction to…

2-计算机发展及应用

【README】 本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】计算机发展史 【1.1】计算机的产生和发展 【1.2】微型计算机的出现与发展 芯片上的晶体管的数量 与 cpu速度间 有没有关…

ASP.NET Core的配置(2):配置模型详解

在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式&#xff0c;其中涉及到三个重要的对象&#xff0c;它们分别是承载结构化配置信息的Configuration&#xff0c;提供原始配置源数据的ConfigurationProvider&#xff0c;以及作为“中间人”的ConfigurationBuilder。…

Mysql的安装与远程登录

一、安装 &#xff08;1&#xff09;linux版A.linux普通版http://www.jb51.net/article/104107.htmB.ubuntu版 1.安装 sudo apt-get install mysql-server apt-get isntall mysql-client sudo apt-get install libmysqlclient-dev2.设置密码cd /etc/mysql vi debian.cnf ,得…

sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

1 前言2 自定义规则实现2.1 规则功能2.2 实现规则的理论基础2.3 规则代码实现3 总结4 参考资料1 前言为了实现如标题所述的将多个静态库合并为一个动态库&#xff0c;内置的 Bazel 规则是没有这个功能的&#xff0c;Bazel C/C 相关的内置规则有&#xff1a;cc_binary &#xff…

(转)base64编码(严格说来,base64不算作加解密算法)

【README】 1.本文转自&#xff1a; Java base64加密解密 - xuwc - 博客园参考&#xff1a; https://www.cnblogs.com/luguo3000/p/3940197.html https://blog.csdn.net/jiahao1186/article/detailhttps://www.cnblogs.com/xuwc/p/14058183.htmlhttps://zh.wikipedia.org/wik…

JavaWeb的web.xml标签元素(一)

普通信息标签 &#xff08;1&#xff09;display-name 定义了WEB应用的名字,在servletContextConfig display-name* XML语法&#xff1a;<display-name>AppName</display-name> &#xff08;2&#xff09;description 可以使用description元素来提供有关部署描述符…

python3多线程第三方库_Python3 多线程

Python3 多线程多线程类似于同时执行多个不同程序&#xff0c;多线程运行有如下优点&#xff1a;使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人&#xff0c;比如用户点击了一个按钮去触发某些事件的处理&#xff0c;可以弹出一个进度条来显示…

采用MiniProfiler监控EF与.NET MVC项目

今天来说说EF与MVC项目的性能检测和监控&#xff0c;相对本篇文章&#xff0c;更推荐大家使用另一个类似组件 NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC MiniProfiler是Stack Ove…

(转)公钥,私钥和数字签名这样最好理解

转自&#xff1a; 公钥&#xff0c;私钥和数字签名这样最好理解_21aspnet的博客-CSDN博客_公钥签名还是私钥签名一、公钥加密 假设一下&#xff0c;我找了两个数字&#xff0c;一个是1&#xff0c;一个是2。我喜欢2这个数字&#xff0c;就保留起来&#xff0c;不告诉你们(私钥…

JavaWeb的web.xml标签元素(二)

JavaWeb的web.xml标签元素&#xff08;一&#xff09; 九、session-config为Web应用中的javax.servlet.http.HttpSession对象定义参数 session-config-session-timeout?session-timeout元素用来指定默认的会话超时时间间隔&#xff0c;以分钟为单位。该元素值必须为整数。如果…

登录系统 提示框_实物资产管理软件操作手册(职员和系统用户)

一、职员和系统用户“职员和系统用户”菜单提供了对公司人员信息进行维护的功能&#xff0c;可以自定义职员编码、 姓名、用户名等相关职员信息。注意&#xff1a;职员编码、用户名需唯一&#xff0c;且用户名一旦保存则不可修改。根据要求可以将“用户类型”分为“职员”和“系…