hibernate数据类型_Hibernate类型初学者指南
hibernate數(shù)據(jù)類型
基本映射概念
學(xué)習(xí)Hibernate時(shí),許多人喜歡跳到父子關(guān)聯(lián),而無(wú)需掌握對(duì)象關(guān)系映射的基礎(chǔ)知識(shí)。 在開始對(duì)實(shí)體關(guān)聯(lián)進(jìn)行建模之前,了解各個(gè)實(shí)體的基本映射規(guī)則非常重要。
Hibernate類型
Hibernate類型是SQL類型和Java原語(yǔ)/對(duì)象類型之間的橋梁。
這些是Hibernate默認(rèn)支持的類型:
| StringType | VARCHAR | 串 |
| 物化球 | CLOB | 串 |
| 文字類型 | LONGVARCHAR | 串 |
| 角色類型 | 焦炭 | 字符或字符 |
| 布爾型 | 比特 | 布爾值還是布爾值 |
| NumericBooleanType | 整數(shù)(例如0 =假和1 =真) | 布爾值還是布爾值 |
| 是否類型 | CHAR(例如,“ N”或“ n” = false,“ Y”或“ y” = true) | 布爾值還是布爾值 |
| TrueFalseType | CHAR(例如,“ F”或“ f” =否,“ T”或“ t” =真) | 布爾值還是布爾值 |
| 字節(jié)類型 | 天音 | 字節(jié)或字節(jié) |
| 短型 | 小靈通 | 短或短 |
| 整數(shù)類型 | 整數(shù) | 整數(shù)或整數(shù) |
| 長(zhǎng)型 | 比金特 | 長(zhǎng)或長(zhǎng) |
| 浮動(dòng)類型 | 浮動(dòng) | 浮動(dòng)或浮動(dòng) |
| 雙重類型 | 雙 | 雙倍或雙倍 |
| BigIntegerType | 數(shù)字 | 大整數(shù) |
| BigDecimalType | 數(shù)字 | 大十進(jìn)制 |
| 時(shí)間戳類型 | 時(shí)間戳 | java.sql.Timestamp或java.util.Date |
| 時(shí)間類型 | 時(shí)間 | java.sql.Time |
| 日期類型 | 日期 | java.sql.Date |
| CalendarType | 時(shí)間戳 | java.util.Calendar或java.util.GregorianCalendar |
| CalendarType | 日期 | java.util.Calendar或java.util.GregorianCalendar |
| 貨幣類型 | VARCHAR | java.util.Currency |
| 語(yǔ)言環(huán)境類型 | VARCHAR | java.util.Locale |
| 時(shí)區(qū)類型 | VARCHAR | java.util.TimeZone |
| 網(wǎng)址類型 | VARCHAR | java.net.URL |
| 類類型 | VARCHAR | java.lang.Class |
| BlobType | BLOB | java.sql.Blob |
| ClobType | CLOB | java.sql.Clob |
| BinaryType | VARBINARY | 字節(jié)[]或字節(jié)[] |
| BinaryType | BLOB | 字節(jié)[]或字節(jié)[] |
| BinaryType | LONGVARBINARY | 字節(jié)[]或字節(jié)[] |
| BinaryType | LONGVARBINARY | 字節(jié)[]或字節(jié)[] |
| CharArrayType | VARCHAR | char []或Character [] |
| UUIDBinaryType | 二進(jìn)制 | java.util.UUID |
| UUIDBinaryType | CHAR或VARCHAR | java.util.UUID |
| UUIDBinaryType | PostgreSQL UUID | java.util.UUID |
| SerializableType | VARBINARY | 可序列化 |
您將始終可以定義自己的自定義類型,我們將在以后的文章中看到。
嵌入式(aka組件)類型
您可以將多個(gè)列分組為特定的Java類型,從而可以在整個(gè)域模型中重復(fù)使用。 如果映射的Java對(duì)象始終依賴于某些外部實(shí)體,則可以為此類域模型映射選擇Embeddable類型。
一個(gè)Embeddable對(duì)象可能包含基本類型和關(guān)聯(lián)映射,但永遠(yuǎn)不能包含@Id。 可嵌入對(duì)象及其擁有的實(shí)體將被持久保存/刪除。
假設(shè)我們有下面SQL表:
CREATE TABLE entity_event(id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),entity_class VARCHAR(255),entity_id BIGINT,message VARCHAR(255),PRIMARY KEY (id));我們可以將entity_class和entity_id分組為一個(gè)Embeddable對(duì)象,該對(duì)象將在兩個(gè)不同的擁有實(shí)體中使用。
Embeddable對(duì)象如下所示:
@Embeddable public class EntityIdentifier implements Serializable {@Column(name = "entity_id", nullable = true)private Long entityId;@Column(name = "entity_class", nullable = true)private Class entityClass;public EntityIdentifier() {}public EntityIdentifier(Class entityClass, Long entityId) {this.entityClass = entityClass;this.entityId = entityId;}public Class getEntityClass() { return entityClass; }public void setEntityClass(Class entityClass) { this.entityClass = entityClass; }public Long getEntityId() { return entityId; }public void setEntityId(Long entityId) { this.entityId = entityId; } }關(guān)聯(lián)的Entity表將繼承Embeddable屬性的關(guān)聯(lián)列。
實(shí)體
實(shí)體與SQL表行的Java等效。 該實(shí)體必須包含一個(gè)@Id屬性,該屬性映射關(guān)聯(lián)的表主鍵。
應(yīng)用程序邏輯對(duì)實(shí)體屬性進(jìn)行更改,并將實(shí)體狀態(tài)更改(持久,合并,刪除)通知持久性上下文。 因此,持久性上下文會(huì)將所有實(shí)體更改轉(zhuǎn)換為SQL語(yǔ)句。
假設(shè)我們有以下SQL表:
CREATE TABLE entity_attribute(id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),entity_class VARCHAR(255),entity_id BIGINT,name VARCHAR(255),VALUE VARCHAR(255),PRIMARY KEY (id));CREATE TABLE entity_event(id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),entity_class VARCHAR(255),entity_id BIGINT,message VARCHAR(255),PRIMARY KEY (id));由于兩個(gè)表都包含entity_class和entity_id列,因此我們可以使用EntityIdentifier Embeddable類型。
@Entity @Table(name = "entity_attribute") public class EntityAttribute {@Id@GeneratedValueprivate Long id;private String name;private String value;private EntityIdentifier entityIdentifier;public Long getId() { return id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public String getValue() { return value; }public void setValue(String value) { this.value = value; }public EntityIdentifier getEntityIdentifier() { return entityIdentifier; }public void setEntityIdentifier(EntityIdentifier entityIdentifier) { this.entityIdentifier = entityIdentifier; } }@Entity @Table(name = "entity_event") public class EntityEvent {@Id@GeneratedValueprivate Long id;private String message;private EntityIdentifier entityIdentifier;public Long getId() { return id; }public String getMessage() { return message; }public void setMessage(String message) { this.message = message; }public EntityIdentifier getEntityIdentifier() { return entityIdentifier; }public void setEntityIdentifier(EntityIdentifier entityIdentifier) { this.entityIdentifier = entityIdentifier; } }測(cè)試時(shí)間
我們將為給定產(chǎn)品創(chuàng)建一個(gè)EntityEvent和一個(gè)EntityAttribute,以查看Embeddable如何與擁有的實(shí)體一起持久保存:
@Test public void testEntityIdentifier() {doInTransaction(new TransactionCallable<Void>() {@Overridepublic Void execute(Session session) {Product product = new Product("LCD");session.persist(product);EntityEvent productEvent = new EntityEvent();productEvent.setMessage(String.format("Product %s added", product.getName()));productEvent.setEntityIdentifier(new EntityIdentifier(product.getClass(),product.getId()));session.persist(productEvent);EntityAttribute productAttribute = new EntityAttribute();productAttribute.setName("AD_CAMPAIGN");productAttribute.setValue("LCD_Sales");productAttribute.setEntityIdentifier(new EntityIdentifier(product.getClass(),product.getId()));session.persist(productAttribute);assertSame(1, session.createQuery("select ea from EntityAttribute ea where ea.entityIdentifier = :entityIdentifier").setParameter("entityIdentifier", new EntityIdentifier(product.getClass(), product.getId())).list().size());return null;}}); }Query:{[ INSERT INTO product(id,name) VALUES (DEFAULT,?) ][LCD]} Query:{[ INSERT INTO entity_event(id,entity_class,entity_id,message) VALUES (DEFAULT,?,?,?) ][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1,Product LCD added]} Query:{[ INSERT INTO entity_attribute(id,entity_class,entity_id,name,VALUE) VALUES (DEFAULT,?,?,?,?) ][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1,AD_CAMPAIGN,LCD_Sales]} Query:{[ SELECT entityattr0_.id AS id1_0_,entityattr0_.entity_class AS entity_c2_0_,entityattr0_.entity_id AS entity_i3_0_,entityattr0_.name AS name4_0_,entityattr0_.VALUE AS value5_0_ FROM entity_attribute entityattr0_ WHERE entityattr0_.entity_class = ?AND entityattr0_.entity_id = ? ][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1]}結(jié)論
在了解實(shí)體關(guān)聯(lián)之前,我們?nèi)匀恍枰w許多概念。 在跳到更高級(jí)的主題之前,您應(yīng)該始終花一些時(shí)間來(lái)理解基本概念。 我的下一篇文章將介紹實(shí)體標(biāo)識(shí)符和所有可用的生成器技術(shù)。
- 代碼可在GitHub上獲得 。
翻譯自: https://www.javacodegeeks.com/2014/06/a-beginners-guide-to-hibernate-types.html
hibernate數(shù)據(jù)類型
總結(jié)
以上是生活随笔為你收集整理的hibernate数据类型_Hibernate类型初学者指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 世界环境日是每年的哪一天
- 下一篇: ejb生命周期_无状态EJB:池化和生命