hibernate中@Entity和@Table的区别

hibernate中@Entity和@Table的区别,第1张

Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库。
这些普通Java对象被称作Entity Bean。
除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。
事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。

Java Persistence API还定义了一种查询语言(JPQL),具有与SQL相类似的特征,只不过做了裁减,以便处理Java对象而非原始的关系表。


hibernate中@Entity和@Table的区别:
@Entity说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名
如果想改变这种默认的orm规则,就要使用@Table来改变class名与数据库中表名的映射规则,@Column来改变class中字段名与db中表的字段名的映射规则

@Entity注释指名这是一个实体Bean,@Table注释指定了Entity所要映射带数据库表,其中@Tablename()用来指定映射表的表名。
如果缺省@Table注释,系统默认采用类名作为映射表的表名。实体Bean的每个实例代表数据表中的一行数据,行中的一列对应实例中的一个属性。
@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:
1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入;
2)unique:是否唯一;
3)nullable:是否允许为空;
4)length:对于字符型列,length属性指定列的最大字符长度;
5)insertable:是否允许插入;
6)updatetable:是否允许更新;
7)columnDefinition:定义建表时创建此列的DDL;
8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字。
@Id注释指定表的主键,它可以有多种生成方式:
1)TABLE:容器指定用底层的数据表确保唯一;
2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID);
3)IDENTITY:使用数据库的IDENTITY列莱保证唯一;
4)AUTO:由容器挑选一个合适的方式来保证唯一;
5)NONE:容器不负责主键的生成,由程序来完成。
@GeneratedValue注释定义了标识字段生成方式。
@Temporal注释用来指定javautilDate或javautilCalender属性与数据库类型date、time或timestamp中的那一种类型进行映射。
@Temporal(value=TemporalTypeTIME)

>

@Entity
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
private String name;
private int age;
private String addree;
// Getters and Setters
}

如果没有 @javaxpersistenceEntity 和 @javaxpersistenceId 这两个注解的话,它完全就是一个典型的 POJO 的 Java 类,现在加上这两个注解之后,就可以作为一个实体类与数据库中的表相对应。他在数据库中的对应的表为:

图 1 Employee 表对应的 ER 图

映射规则:

1 实体类必须用 @javaxpersistenceEntity 进行注解;

2 必须使用 @javaxpersistenceId 来注解一个主键;

3 实体类必须拥有一个 public 或者 protected 的无参构造函数,之外实体类还可以拥有其他的构造函数;

4 实体类必须是一个顶级类(top-level class)。一个枚举(enum)或者一个接口(interface)不能被注解为一个实体;

5 实体类不能是 final 类型的,也不能有 final 类型的方法;

6 如果实体类的一个实例需要用传值的方式调用(例如,远程调用),则这个实体类必须实现(implements)javaioSerializable 接口。

将一个 POJO 的 Java 类映射成数据库中的表如此简单,这主要得益于 Java EE 5种引入的  Configuration by Exception 的理念,这个理念的核心就是容器或者供应商提供一个缺省的规则,在这个规则下程序是可以正确运行的,如果开发人员有特殊的需求,需要改变这个默认的规则,那么就是对默认规则来说就是一个异常(Exception)。

如上例所示:默认的映射规则就是数据库表的名字和对应的 Java 类的名字相同,表中列的名字和 Java 类中相对应的字段的名字相同。

现在我们可以改变这种默认的规则:

清单 2 使用 @Table 和 @Column 注解修改映射规则

@Entity
@Table(name="Workers")
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(name="emp_name", length=30)
private String name;
@Column(name="emp_age", nullable=false)
private int age;
@Column(name="emp_address", nullable=false ,unique=true)
private String addree;
// Getters and Setters
}

首先我们可以可以使用

@JavaxpersistenceTable 这个注解来改变 Java 类在数据库表种对应的表名。这个注解的定义如下:

@javaxpersistenceColumn 注解,定义了列的属性,你可以用这个注解改变数据库中表的列名(缺省情况下表对应的列名和类的字段名同名);指定列的长度;或者指定某列是否可以为空,或者是否唯一,或者能否更新或插入。

从它的定义可以看出他只可以用在类中的方法前面或者字段前面。

其中 name 属性的值为数据库中的列名,unique 属性说明该烈是否唯一,nullable 属性说明是否可以为空,length 属性指明了该列的最大长度等等。其中 table 属性将在 @SecondaryTable 的使用中已有过介绍。

JPA 中两种注解方式

JPA 中将一个类注解成实体类(entity class)有两种不同的注解方式:基于属性(property-based)和基于字段(field-based)的注解。

1,基于字段的注解,就是直接将注解放置在实体类的字段的前面。前面的 Employee 实体类就是使用的这种注解方式;

2,基于属性的注解,就是直接将注解放置在实体类相应的 getter 方法前面,而不是 setter 方法前面(这一点和 Spring 正好相反)。前面的 Employee 实体类如果使用基于属性注解的方式就可以写成如下形式。

但是同一个实体类中必须并且只能使用其中一种注解方式,要么是基于属性的注解,要么是基于字段的注解。两种不同的注解方式,在数据库中对应的数据库表是相同的,没有任何区别,开发人员可以根据自己的喜好任意选用其中一种注解方式。

@SecondaryTable 的使用

上面介绍的几个例子都是一个实体类映射到数据库中的一个表中,那么能否将一个实体类映射到数据库两张或更多表中呢表中呢。在有些情况下如数据库中已经存在原始数据类型,并且要求不能更改,这个时候如果能实现一个实体类对应两张或多张表的话,将是很方便的。JPA20 中提供了一个 @SecondaryTablez 注解(annotation)就可以实现这种情况。下面用一个例子说明一下这个注解的使用方法:

清单 6 @SecondaryTable 的使用

@Entity
@SecondaryTables({
@SecondaryTable(name = "Address"),
@SecondaryTable(name = "Comments")
})
public class Forum implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
@Column(table = "Address", length = 100)
private String street;
@Column(table = "Address", nullable = false)
private String city;
@Column(table = "Address")
private String conutry;
@Column(table = "Comments")
private String title;
@Column(table = "Comments")
private String Comments;
@Column(table = "Comments")
private Integer comments_length;
// Getters and Setters
}

清单 5 中定义了两个 Secondary 表,分别为 Address 和 Comments,
同时在 Forum 实体类中也通过 @Column 注解将某些子段分别分配给了这两张表,那些 table 属性得值是 Adress 的就会存在于 Address 表中,
同理 table 属性的值是 Comments 的就会存在于 Comments 表中。那些没有用 @Column 注解改变属性默认的字段将会存在于 Forum 表中。
图 4 就是持久化后在数据库中对应的表的 ER 图,从图中可看出来,这些字段如我们预料的一样被映射到了不同的表中。

图 4 @SecondaryTable 持久化后对赢得 ER 图

嵌套映射

在使用嵌套映射的时候首先要有一个被嵌套的类,清单 5 中 Address 实体类使用 @Embeddable 注解,说明这个就是一个可被嵌套的类,与 @EmbeddedId 复合主键策略中的主键类(primary key class)稍有不同的是,这个被嵌套类不用重写 hashCode() 和 equals() 方法,复合主键将在后面进行介绍。

清单 7 被嵌套类

@Embeddable
public class Address implements Serializable  {
private String street;
private String city;
private String province;
private String country;
// Getters and Setters
}

清单 6 中 Employee 实体类是嵌套类的拥有者,其中使用了 @Embedded 注解将 Address 类嵌套进来了。

清单 8 嵌套类的使用者

@Entity
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationTypeAUTO)
private Long id;
private String name;
private String email;
private String cellPhone;
@Embedded
private Address address;
// Getters and Setters
}

清单 7 是持久化后生成的数据库表,可以看出被嵌套类的属性,也被持久化到了数据库中,默认的表名就是嵌套类的拥有者的类名。

清单 9 使用嵌套类生成的表结构

CREATE TABLE `employee` (
`ID` bigint(20) NOT NULL,
`EMAIL` varchar(255) default NULL,
`NAME` varchar(255) default NULL,
`CELLPHONE` varchar(255) default NULL,
`STREET` varchar(255) default NULL,
`PROVINCE` varchar(255) default NULL,
`CITY` varchar(255) default NULL,
`COUNTRY` varchar(255) default NULL,
PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

被嵌套类的注解方式,field 方式或者 property 方式,依赖于嵌套类的拥有者。上面例子中的 Employee 实体类采用的是 field 注解方式,那么在持久化的过程中,被嵌套类 Address 也是按照 field 注解方式就行映射的。

我们也可以通过 @Access 注解改变被嵌套类映射方式,清单 8 通过使用 @Access 注解将 Address 被嵌套类的注解方式设定成了 property 方式。清单 9 Employee 仍然采用 filed 注解方式。这种情况下,持久化的时候,被嵌套类就会按照自己设定的注解方式映射,而不会再依赖于嵌套类的拥有者的注解方式。但这并不会映射的结果。

清单 10 基于 property 方式注解的被嵌套类

@Embeddable
@Access(AccessTypePROPERTY)
public class Address implements Serializable  {
private String street;
private String city;
private String province;
private String country;
@Column(nullable=false)
public String getCity() {
return city;
}
public void setCity(String city) {
thiscity = city;
}
@Column(nullable=false,length=50)
public String getCountry() {
return country;
}
public void setCountry(String country) {
thiscountry = country;
}
@Column(nullable=false,length=20)
public String getProvince() {
return province;
}
public void setProvince(String province) {
thisprovince = province;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
thisstreet = street;
}
}

清单 11 基于 field 方式注解

@Entity
@Access(AccessType FIELD)
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationTypeAUTO)
private Long id;
private String name;
private String email;
private String cellPhone;
@Embedded
private Address address;
// Getters and Setters
}

事先设定被嵌套类的注解方式,是一种应该大力提倡的做法,因为当同一个类被不同的注解方式的类嵌套时,可能会出现一些错误。

根据你的叙述,你可以在类中再定义三个属性,分别用0或1表示你现在的三个属性是否更新。例如 int updateA=0; int updateB=0;int updateC=0;(这是初始状态,表示ABC三个属性都没有更新过),等你更新A的时候,顺便把updateA置1。

java
EJB中session
Bean和Entity
Bean的解释和区别如下:
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务 *** 作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。
对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Entity
Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity
Bean对象相当于新建一条记录,删除一个Entity
Bean会同时从数据库中删除对应记录,修改一个EntityBean时,容器会自动将Entity
Bean的状态和数据库同步

启动游民星空APP
点击领取免费游戏
获取APP
我的世界》183指令大全 指令代码使用教程
MCBBS End-Enderman 2015-06-03 16:00
13
4replaceitem指令
用于给现存的实体替换装备或者给现存的方块替换物品。现存的方块包括所有带有物品栏的方块(如箱子等)。基本格式为
replaceitem 模式 方块坐标/选择器 格子数据 物品名称 数据值 物品数据标签
replaceitem共有两种模式,分别是block以及entity。block是用于替换方块的物品,而entity用来替换实体的物品。坐标和选择器分别是block和entity的需求。格子数据是replaceitem特有的各自数据标签。其余的和give相同。
entity:基本格式为
replaceitem entity 格子数据 物品名称 数据值 物品数据标签
任何生物都有格子数据,比如僵尸利用slotweapon可以给僵尸全部带上武器(就像entitydata+Equipment)。
游民星空
共有slotweapon(武器栏)、slotinventory(玩家背包/容器栏,需要指定,格子为0-26)、slotarmorhead(实体头)、slotarmorchest(实体胸甲)、slotarmorlegs(实体腿)、slotarmorfeet(实体脚)、slotenderchest(末影箱格子,需要指定,格子为0-26)、slothotbar(玩家物品快捷栏,需要指定,格子为0-8)、slotvillager(村民背包栏,需要指定,格子数为0-7)、slothorsechest(驴/骡箱子,需要指定,如果指定普通的马会失败,格子为2-16)、slothorsesaddle(马鞍栏)、slothorsearmor(马甲栏)
上面的格子数据需要有些数据需要制定,要指定玩家的格子数,后面都要加一个“格子数”,比如
replaceitem entity @e[type=Player] slotinventory21 command_block
这会将玩家的背包栏的第22格替换为命令方块(0是第一格,所以要往后数一格)。
游民星空
其他需要指定格子数的也按照这种格式即可。
在类似于马鞍这样的格子数据,只能用minecraft:saddle和minecraft:air之间替换,否则无效。马铠可以让三种马铠交换这来弄以及minecraft:air。
物品数据标签可以制定,比如
replaceitem entity @e[type=Zombie] slotweapon diamond_sword 1 0 {ench:[{id:20,lvl:1}]}
这会把所有的现存僵尸都装上带火焰伤害的钻石剑。
游民星空
(某些即使看似无法使用武器的生物,比如末影人,装上后攻击也会有附魔的效果)
游民星空
游民星空
block:基本格式为
replaceitem block 方块坐标 slotcontainer格子 物品名称 数据值 物品数据标签
坐标处填写要改变物品数据的方块坐标,block只能使用slotcontainer格子来执行命令。格子填写数字,用来指定替换的格子(比如箱子是0-26,漏斗是0-4,发射器和投掷器是0-8,熔炉是0-2,酿造台是0-3等等)。其余使用方法和entity一样。
replaceitem要和entitydata区分,前者是改变生物/方块物品栏,后者是改变实体本身NBT。
相关内容请关注:我的世界专区
责任编辑:Shy夏夏
文章导航
物品相关-replaceitem指令
上一页
11/51
下一页
本文对您是否有帮助
有209
没有展开全文
我的世界
92
PC / PS4 / NintendoSwitch / XboxOne
打开游民App,点击免费领取游戏

《我的世界》三国赤壁版本全任务攻略图文详解
《我的世界》手机版指令代码汇总
《我的世界》植物介绍与种植技巧
《我的世界》盾牌制作方法
《我的世界》铁傀儡制作方法
《我的世界》114版本自动羊毛机制作方法
《我的世界》热带鱼作用及获取方法介绍
《我的世界》局域网存档备份方法
《我的世界》隐藏壁炉制作方法教学
《我的世界》飞行器电梯制作方法
热门推荐
腾讯X罗技云游戏掌机外观泄露:人体工学、纯白机身
打开游民APP
271评论
日本女作家因换头像被网友喷 晒本人照片反击网友
打开游民APP
150评论
TGA 2022颁奖礼:年度最佳《艾尔登法环》​​​!
TGA 2022颁奖礼:年度最佳《艾尔登法环》​​​!
1446
TGA:小岛工作室《死亡搁浅2》正式公布!登陆PS5
TGA:小岛工作室《死亡搁浅2》正式公布!登陆PS5
449
小米迷你主机亮相:手掌大小的桌面电脑 1211发布
小米迷你主机亮相:手掌大小的桌面电脑 1211发布
116
热门H5手游更多
菲尼西雅战记
消失的轨迹
魔导英雄传说
巅峰冠军足球
全部评论发布评论
游民星空网友
Lv1
2016-02-15 11:46
非常好,谢谢扫盲,说不好的人大概是看不懂
5
游民用户
Lv0
2015-09-02 18:42
转载请注明原出处地址,标出原作者
5
游民用户
Lv0
2016-09-12 18:08
好滴
1
游民用户
Lv0
2016-09-12 18:28
那个人是我!!!
1
打开游民APP,查看7条精彩评论
游民星空
打开App阅读体验更佳,攻略、资讯实时更新
下载APP

后室(TheBackRooms)实体Entity 16“Nguithr'xurh”麻痹者
759阅读
b站鸽子王在此
关注
实体编号: 16
栖息地: Level 1,Level 2,Level 3
一张罕见的Nguithr'xurh幼崽
描述:
Nguithr'xurh是一种大型类蜘蛛生物,具有16只附肢。尽管与其近距离接触非常危险,但它们不仅速度慢,且据观察不会追逐猎物。只要你避开它的陷阱,它们就基本是无害的。
行为:
它们通常会隐匿在天花板上,制造球状的网并以镇静剂填充之,这些镇静剂尽管无法完全麻痹受害者,但足以在很大程度上抑制一个人的思维能力。接下来,它们会用额外的网将这些球悬挂在天花板上。在附近没有猎物时,它会持续这样做。
对于小型猎物(如其他虫子),它只会喷出化学物质就开始进食猎物。但对于人类,它会完全静止不动来避免被注意到。当流浪者在它的陷阱正下方时,它会切下一个球。接着球会爆开并将镇静剂洒到目标身上。大多数目标不会注意到第一个球,但会开始感到疑惑。
镇静剂的效果生效后,受害者对周围环境的感知会开始降低。此时,它会立刻一次性放下所有的球,最终使得目标对任何外部刺激完全失去反应。随后,Nguithr'xurh会下降到它的猎物旁边并开始活活吃掉它。进食完成后,它会回到最近的天花板上并开始休眠直到再次布置它的陷阱。
生物学特征:
Nguithr'xurh目前被归类为蛛形纲避日目。不同个体尺寸差异很大,但Nguithr'xurh的平均尺寸约为4英寸宽、5英寸长。
发现:
确信Reddit用户u/Lordmac29是首个发现Entity 16的人,此前他曾向一名MEG成员发送了一条充斥大量拼写和语法错误的信息。由于这条信息除了“蜘蛛”和“十六条腿”之外几乎无法理解,当时人们认为u/Lordmac29受到了某种致幻性物质的影响,因此并未进行任何调查。
首次被记录的Entity 16目击事件来自一支正在执行与上述团体无关任务的MEG探索团队。他们在一群Nguithr'xurh的正下方扎营,当他们意识到发生了什么事时,已有2名成员受了无法挽回的致命伤。团队立刻返回安全的基地并记录了这一事件和实体。
该条目的初版是由一名MEG探险者创建的,但他并未意识到自己仍处于Entity 16分泌物的强大镇静作用下。Entity 16的名称本应是“麻痹者”或“麻痹蜘蛛”,但却被打成了“Nguithr'xurh”。这一名称被保留以警示人们其镇静效果有多么强大。
研究:
尽管该实体因其体型而具有危险性,但其分泌物被证实是相当无害的,即使在大剂量时也是如此。研究正在进行以制造高效的止痛药、抗抑郁药以及其他有益的药物,这些药物正是后室中人员迫切需要的。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/12870211.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-28
下一篇2025-08-28

发表评论

登录后才能评论

评论列表(0条)

    保存