休眠类型初学者指南
基本映射概念
學習Hibernate時,許多人喜歡跳到父子關聯,而無需掌握對象關系映射的基礎知識。 在開始對實體關聯進行建模之前,了解各個實體的基本映射規則非常重要。
休眠類型
休眠類型是SQL類型和Java原語/對象類型之間的橋梁。
這些是Hibernate默認支持的類型:
| StringType | VARCHAR | 串 |
| 物化球 | CLOB | 串 |
| 文字類型 | LONGVARCHAR | 串 |
| 角色類型 | 焦炭 | 字符或字符 |
| 布爾型 | 比特 | 布爾值或布爾值 |
| NumericBooleanType | 整數(例如0 =假和1 =真) | 布爾值或布爾值 |
| 是否類型 | CHAR(例如,“ N”或“ n” = false,“ Y”或“ y” = true) | 布爾值或布爾值 |
| TrueFalseType | CHAR(例如,“ F”或“ f” =否,“ T”或“ t” =真) | 布爾值或布爾值 |
| 字節類型 | 天音 | 字節或字節 |
| 短型 | SMALLINT | 短或短 |
| 整數類型 | 整數 | 整型或整型 |
| 長型 | 比金特 | 長或長 |
| 浮動類型 | 浮動 | 浮動或浮動 |
| 雙重類型 | 雙 | 雙倍或雙倍 |
| BigIntegerType | 數字 | 大整數 |
| BigDecimalType | 數字 | 大十進制 |
| 時間戳類型 | 時間戳 | java.sql.Timestamp或java.util.Date |
| 時間類型 | 時間 | java.sql.Time |
| 日期類型 | 日期 | java.sql.Date |
| CalendarType | 時間戳 | java.util.Calendar或java.util.GregorianCalendar |
| CalendarType | 日期 | java.util.Calendar或java.util.GregorianCalendar |
| 貨幣類型 | VARCHAR | java.util.Currency |
| 語言環境類型 | VARCHAR | java.util.Locale |
| 時區類型 | VARCHAR | java.util.TimeZone |
| 網址類型 | VARCHAR | java.net.URL |
| 類類型 | VARCHAR | java.lang.Class |
| BlobType | BLOB | java.sql.Blob |
| ClobType | CLOB | java.sql.Clob |
| BinaryType | VARBINARY | 字節[]或字節[] |
| BinaryType | BLOB | 字節[]或字節[] |
| BinaryType | LONGVARBINARY | 字節[]或字節[] |
| BinaryType | LONGVARBINARY | 字節[]或字節[] |
| CharArrayType | VARCHAR | char []或Character [] |
| UUIDBinaryType | 二進制 | java.util.UUID |
| UUIDBinaryType | CHAR或VARCHAR | java.util.UUID |
| UUIDBinaryType | PostgreSQL UUID | java.util.UUID |
| SerializableType | VARBINARY | 可序列化 |
您將始終可以定義自己的自定義類型,我們將在以后的文章中看到。
嵌入式(aka組件)類型
您可以將多個列分組為特定的Java類型,該類型可以在整個域模型中重復使用。 如果映射的Java對象始終依賴于某些外部實體,則可以為此類域模型映射選擇Embeddable類型。
一個Embeddable對象可以包含基本類型和關聯映射,但不能包含@Id。 可嵌入對象及其擁有的實體將被持久保存/刪除。
假設我們有下面的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分組為一個Embeddable對象,該對象將在兩個不同的擁有實體中使用。
Embeddable對象如下所示:
@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; } }關聯的Entity表將繼承Embeddable屬性的關聯列。
實體
實體與SQL表行的Java等效。 該實體必須包含一個@Id屬性,該屬性映射關聯的表主鍵。
應用程序邏輯對實體屬性進行更改,并向持久性上下文通知實體狀態更改(持久,合并,刪除)。 因此,持久性上下文會將所有實體更改轉換為SQL語句。
假設我們有以下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));我們可以利用EntityIdentifier Embeddable類型,因為兩個表都包含entity_class和entity_id列。
@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; } }測試時間
我們將為給定產品創建一個EntityEvent和一個EntityAttribute,以查看Embeddable如何與擁有的實體一起持久保存:
@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]}結論
在了解實體關聯之前,我們仍然需要涵蓋許多概念。 在跳到更高級的主題之前,您應該始終花一些時間來理解基本概念。 我的下一篇文章將介紹實體標識符和所有可用的生成器技術。
- 代碼可在GitHub上獲得 。
翻譯自: https://www.javacodegeeks.com/2014/06/a-beginners-guide-to-hibernate-types.html
總結
- 上一篇: liberty是什么币?
- 下一篇: 定级备案材料定级备案报告(定级备案材料)