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[] 和序列化的類型將被在一個斑點持續存在。
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
該注釋可以應用于常規的性質以及 @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注釋來覆蓋特定實體的嵌入對象的列映射 :
???????該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
總結
以上是生活随笔為你收集整理的Hibernate注解(二)之映射简单的属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本田与三菱签署协议:推动电动汽车商用,探
- 下一篇: 滤芯多久换一次最好 滤芯什么时候更换一次