日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

休眠类型初学者指南

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 休眠类型初学者指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本映射概念

學習Hibernate時,許多人喜歡跳到父子關聯,而無需掌握對象關系映射的基礎知識。 在開始對實體關聯進行建模之前,了解各個實體的基本映射規則非常重要。

休眠類型

休眠類型是SQL類型和Java原語/對象類型之間的橋梁。


這些是Hibernate默認支持的類型:

休眠類型(org.hibernate.type) JDBC類型 Java類型
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

總結

以上是生活随笔為你收集整理的休眠类型初学者指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。