JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-001Mapping basic properties(@Basic、@Access、access="noop"、@Formula、@ColumnTransformer、@Generated、 @ColumnDefaul、@Temporal、@Enumerated)
一、简介
在JPA中,默认所有属性都会persist,属性要属于以下3种情况,Hibernate在启动时会报错
1.java基本类型或包装类
2.有注解 @Embedded
3.有实现java.io.Serializable
二、Overriding basic property defaults
1.@javax.persistence.Transient
如果不想属性被持久化,则注解
@javax.persistence.Transient
2.@Basic(optional = false)和@Column(nullable = false)、 @NotNull的区别
all persistent properties are nullable and optional; 若注解@Basic(optional = false),则Hibernate会在SQL上加上not null约束,是依靠数据库来检查是否为空。若为空Hibernate will complain with an exception before hitting the database with an SQL
statement.
(1)
@Basic(optional = false)
BigDecimal initialPrice;
(2)
@Column(name = "START_PRICE", nullable = false)
BigDecimal initialPrice;
We recommend the Bean Validation @NotNull annotation so you can manually validate an Item instance and/or have your user interface code in the presentation layer execute validation checks automatically.
三、Customizing property access
1.使用@Access(AccessType.PROPERTY),使加载实体时访问get、set方法
@Entity
public class Item {
@Id
@GeneratedValue(generator = Constants.ID_GENERATOR)
protected Long id; @Access(AccessType.PROPERTY)
@Column(name = "ITEM_NAME")
protected String name; //Hibernate calls getName() and setName() when loading and storing items.
public String getName() {
return name;
} public void setName(String name) {
this.name = !name.startsWith("AUCTION: ") ? "AUCTION: " + name : name;
}
}
2.<access="noop">
For example, let’s say the ITEM
database table has a VALIDATED column and your Hibernate application won’t access this column through the domain model. It might be a legacy column or a column maintained by another application or database trigger. All you want is to refer to this column in a JPA query such as select i from Item i where i.validated = true or select i.id, i.validated from Item i . The Java Item class in your domain model doesn’t have this property; hence there is no place to put annotations. The only way to map such a virtual property is with an hbm.xml native metadata file:
<hibernate-mapping>
<class name="Item">
<id name="id">
...
</id>
<property name="validated" column="VALIDATED" access="noop" />
</class>
</hibernate-mapping>
This mapping tells Hibernate that you’d like to access the virtual Item#validated property, mapped to the VALIDATED column, in queries; but for value read/writes at runtime, you want “no operation” on an instance of Item . The class doesn’t have that attribute. Remember that such a native mapping file has to be complete: any annotations on the Item class are now ignored!
3.Using derived properties
The given SQL formulas are evaluated every time the Item entity is retrieved from the database and not at any other time, so the result may be outdated if other properties are modified. The properties never appear in an SQL INSERT or UPDATE , only in SELECT s. Evaluation occurs in the database; Hibernate embeds the SQL formula in the
SELECT clause when loading the instance.
@org.hibernate.annotations.Formula(
"substr(DESCRIPTION, 1, 12) || '...'"
)
protected String shortDescription;
@org.hibernate.annotations.Formula(
"(select avg(b.AMOUNT) from BID b where b.ITEM_ID = ID)"
)
protected BigDecimal averageBidAmount;
4. @org.hibernate.annotations.ColumnTransformer
@Column(name = "IMPERIALWEIGHT")
@org.hibernate.annotations.ColumnTransformer(
read = "IMPERIALWEIGHT / 2.20462",
write = "? * 2.20462"
)
protected double metricWeight;
Hibernate also applies column converters in query restrictions. For example, the following query retrieves all items with a weight of two kilograms:
List < Item > result =
em.createQuery("select i from Item i where i.metricWeight = :w")
.setParameter("w", 2.0)
.getResultList();
The actual SQL executed by Hibernate for this query contains the following restriction in the WHERE clause:
where i.IMPERIALWEIGHT / 2.20462=?
注意:Note that your database probably won’t be able to rely on an index for this restriction;you’ll see a full table scan, because the weight for all ITEM rows has to be calculated to evaluate the restriction.
5.@org.hibernate.annotations.Generated
是否标@org.hibernate.annotations.Generated注解的区别:
Typically, Hibernate applications need to refresh instances that contain any properties for which the database generates values, after saving. This means you would have to make another round trip to the database to read the value after inserting or updating a row. Marking properties as generated, however, lets the application delegate this responsibility to Hibernate. Essentially, whenever Hibernate issues an SQL INSERT or UPDATE for an entity that has declared generated properties, it does a SELECT immediately afterward to retrieve the generated values
@Temporal(TemporalType.TIMESTAMP)
@Column(insertable = false, updatable = false)
@org.hibernate.annotations.Generated(
org.hibernate.annotations.GenerationTime.ALWAYS
)
protected Date lastModified;
@Column(insertable = false)
@org.hibernate.annotations.ColumnDefault("1.00")
@org.hibernate.annotations.Generated(
org.hibernate.annotations.GenerationTime.INSERT
)
protected BigDecimal initialPrice;
6.Temporal properties
@Temporal(TemporalType.TIMESTAMP)
@Column(updatable = false)
@org.hibernate.annotations.CreationTimestamp
protected Date createdOn;
// Java 8 API
// protected Instant reviewedOn;
Available TemporalType options are DATE , TIME , and TIMESTAMP , establishing what part of the temporal value should be stored in the database.
7.@Enumerated,若不注解,枚举默认是次序数字
package org.jpwh.model.querying; public enum AuctionType {
HIGHEST_BID,
LOWEST_BID,
FIXED_PRICE
}
@NotNull
@Enumerated(EnumType.STRING)
protected AuctionType auctionType = AuctionType.HIGHEST_BID;
Without the @Enumerated annotation, Hibernate would store the ORDINAL position of the value. That is, it would store 1 for HIGHEST_BID , 2 for LOWEST_BID , and 3 for FIXED_PRICE . This is a brittle default;
8.
四、
五、
JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-001Mapping basic properties(@Basic、@Access、access="noop"、@Formula、@ColumnTransformer、@Generated、 @ColumnDefaul、@Temporal、@Enumerated)的更多相关文章
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-007UserTypes的用法(@org.hibernate.annotations.Type、@org.hibernate.annotations.TypeDefs、CompositeUserType、DynamicParameterizedType、、、)
一.结构 二.Hibernate支持的UserTypes接口 UserType —You can transform values by interacting with the plain JD ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-006类型转换器( @Converter(autoApply = true) 、type="converter:qualified.ConverterName" )
一.结构 二.代码 1. package org.jpwh.model.advanced; import java.io.Serializable; import java.math.BigDecim ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-005控制类型映射(Nationalized、@LOB、@org.hibernate.annotations.Type)
一.简介 1. 2. 3. 4. to override this default mapping. The JPA specification has a convenient shortcut a ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-004嵌套组件的注解AttributeOverrides
一.数据库 二.代码 1. package org.jpwh.model.advanced; import javax.persistence.AttributeOverride; import ja ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-003使用@AttributeOverrides
Each @AttributeOverride for a component property is “complete”: any JPA or Hibernate annotation on t ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-002使用@Embeddable
一.数据库 二.代码 1. package org.jpwh.model.simple; import javax.persistence.Column; import javax.persisten ...
- JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(<delimited-identifiers/>、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)
一.自定义映射的表名 1. @Entity @Table(name = "USERS") public class User implements Serializable { / ...
- JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-003Table per concrete class with unions(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)、<union-subclass>)
一.代码 1. package org.jpwh.model.inheritance.tableperclass; import org.jpwh.model.Constants; import ja ...
- JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-002Table per concrete class with implicit polymorphism(@MappedSuperclass、@AttributeOverride)
一.结构 二.代码 1. package org.jpwh.model.inheritance.mappedsuperclass; import javax.persistence.MappedSup ...
随机推荐
- STM32管教复用与重映射关系
摘自:http://blog.csdn.net/lincheng15/article/details/51789093 概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出 2.其他外设的输入 ...
- Java实现TCP之Echo客户端和服务端
Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- TFT LCD 参数详解
我的板子设置HCLK=100M因此CLKVAL= int(HCLK/(VCLK*2)-1),其中VCLK即上图的DCLK=6.4M, CLKVAL="int"(100/12.8-1 ...
- Java学习之IO流总结
---恢复内容开始--- 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块区间,在这个文件里面存放着各种各样的数据,我们想读文 ...
- 二、break,continue区别
break:作用于switch,和循环语句,用于跳出,或者称为结束 break语句单独存在,下面不要定义其他语句,因为执行不到,编译会失败,当循环套时,break会跳出当前所在循环,要跳出外部循环,只 ...
- c++ swap 函数
转载地址 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T ...
- proxy server 代理服务器
有时候,我觉得自己需要去搞明白.搞清楚一个概念,帮我打通一下自己的知识体系,或者说,尝试联络起来. 1. 简介 突破自身IP限制,访问国外站点. 访问单位或者团体内部资源. 突破中国电信的IP封锁. ...
- poj 2449 Remmarguts' Date K短路+A*
题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...
- shader 的 nounroll
刚刚解决了一个特别坑的问题. 客户有个需求 需要shader里面 loop 的iterator数量 在运行时确定.z 这样对于里面存在 sample的loop就会被force unroll但因为co ...
- Hibernate联合主键映射
1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...