注:以下内容是阅读Java persistence with Hibernate后,自己理解到的,只涉及Hibernate core 的内容,不涉及JPA等注释的内容
4.1 Understanding entities and value types(理解实体类型和值类型)<o:p></o:p>
<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">4.1.1</st1:chsdate> Fine-grained domain models(细粒度领域模型)<o:p></o:p>
<o:p> </o:p>
比如我们的领域中有User这个模型,包含的字段有地址(城市、街名、邮编),在数据库中user表内包含了城市、街名、邮编等字段;但在建模时,最好是将地址列为单独的一个类,使之与user想关联,这样能更好的使用聚合,复用代码。<o:p></o:p>
<o:p> </o:p>
<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">4.1.2</st1:chsdate> Defining the concept(定义概念)<o:p></o:p>
<o:p> </o:p>
实体类型:<o:p></o:p>
作为一个独立的实体存在,其生命周期独立于其他实体,可以被其他实体共享.如在数据库中有其对应的标识(identity),对应一条记录,该实体(记录)可以在数据库中共享(标识作为外键使用)。<o:p></o:p>
<o:p> </o:p>
值类型:<o:p></o:p>
不能作为一个独立的实体存在,只能依附于其他实体,作为其他实体的一部分,其生命周期依赖其所依附的实体(宿主),不能被多个实体共享。如在User 中Address类型,是依赖于其所附属的user,在数据库中表现为user表的字段。<o:p></o:p>
<o:p> </o:p>
<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">4.1.3</st1:chsdate>Identifying entities and value types<o:p></o:p>
1、判断该模型是否需要标识<o:p></o:p>
2、判断该模型是否只能被一个实体拥有<o:p></o:p>
3、判断是否能被多个实体引用<o:p></o:p>
<o:p> </o:p>
4.2 Mapping entities with identity<o:p></o:p>
<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">4.2.1</st1:chsdate>、understand java identify and equality<o:p></o:p>
1、objects are identical if they occupy the same location in the JVM, using ‘==’ notion to denote that.<o:p></o:p>
2、Object are equality if they have the same value, using the method equals(Object o) to check if they are equality.<o:p></o:p>
<o:p> </o:p>
<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">4.2.2</st1:chsdate> Handing database identity<o:p></o:p>
1、In POJOs, you should declare a identity property, for example :long id, but you should take attention to that whether you need a method setId();<o:p></o:p>
2、mapping the identity property to database primary key column, you should take attention to the id generator, native? Assigned? Or increment.<o:p></o:p>
<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">4.2.3</st1:chsdate> database primary key<o:p></o:p>
A primary key must meet :<o:p></o:p>
1: Its value is never null<o:p></o:p>
2: Each row has a unique value<o:p></o:p>
3: the value of a particular row never change<o:p></o:p>
Sometimes an identity property means nothing about the owing object, just to identify it.<o:p></o:p>
4.4 Generated and default property values<o:p></o:p>
4.4.1 basic class mapping
1、如果一个持久类的某些字段不需要自行赋值,而使用数据库产生值,要求该类的对象持久化之前,这些字段为null值,此时获取返回null;持久化(存入数据库)后,这些字段为数据库默认值,此时获取返回默认值。<o:p></o:p>
<o:p> </o:p>
Hibernate实现流程:<o:p></o:p>
每次insert 或者 update对象时,立即产生一个select查询,并将默认值返回到对象中。<o:p></o:p>
XML文件:<o:p></o:p>
<property name="lastModified"><o:p></o:p></property>
<property name="lastModified"><o:p></o:p></property>
<property name="lastModified"<o:p></o:p>
column="LAST_MODIFIED"<o:p></o:p>
update="false"<o:p></o:p>
insert="false"<o:p></o:p>
generated="always"/><o:p></o:p>
<o:p></o:p>
<o:p> </o:p>
Annotations:<o:p></o:p>
@Column(updatable = false, insertable = false)<o:p></o:p>
@org.hibernate.annotations.Generated(<o:p></o:p>
org.hibernate.annotations.GenerationTime.ALWAYS<o:p></o:p>
)<o:p></o:p>
private Date lastModified;<o:p></o:p>
注意:此时该类不应该存在更改该属性的方法,如setLastModified方法<o:p></o:p>
2 如果类的某一字段所对应的数据字段有默认值,如,price:$1;要求:如果对象的属性为null,则使用默认值;如果不为空,则使用该值.
<class name="Item" table="ITEM"<o:p></o:p>
dynamic-insert="true" dynamic-update="true"><o:p></o:p>
...<o:p></o:p>
<property
name="initialPrice" type="big_decimal"><o:p></o:p>
column name="INITIAL_PRICE"<o:p></o:p>
default="'1'"<o:p></o:p>
generated="insert"/><o:p></o:p>
</property><o:p></o:p>
...<o:p></o:p>
</class><o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p> </o:p>
注意:必须指定dynamic-insert="true" dynamic-update="true" ,否则还是插入null值,而且持久化该对象后,你必须进行flush才能在对象中获取默认值,如:<o:p></o:p>
Item newItem = new Item(...);<o:p></o:p>
session.save(newItem);<o:p></o:p>
newItem.getInitialPrice(); // is null<o:p></o:p>
session.flush(); // Trigger an INSERT<o:p></o:p>
// Hibernate does a SELECT automatically<o:p></o:p>
newItem.getInitialPrice(); // is $1<o:p></o:p>
<o:p> </o:p>
<o:p>4.4.2 Mapping components</o:p>
<o:p> 在之前的Address和User例子中,Address最为值类型,而User最为实体类型,如何将Address映射到User表中的字段的呢?</o:p>
<o:p> 注意:值类型没有标识(identity)</o:p>
<o:p> public class Address {
private String street;
private String zipcode;
private String city;
public Address() {}
public String getStreet() { return street; }
public void setStreet(String street) { this.street = street; }
public String getZipcode() { return zipcode; }
public void setZipcode(String zipcode) {
this.zipcode = zipcode; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
}
</o:p>
<o:p> Hibernate使用Component属性:</o:p>
<class name="User" table="USER">
<id name="id" column="USER_ID" type="long">
<generator class="native"/>
<id>
<property name="loginName" column="LOGIN" type="string"/>
<component name="homeAddress" class="Address">
<property name="street" type="string"
column="HOME_STREET" not-null="true"/>
<property name="city" type="string"
column="HOME_CITY" not-null="true"/>
<property name="zipcode" type="string"
column="HOME_ZIPCODE" not-null="true"/>
</component>
</class>
<o:p> 我们也可以指定Address对象所处在的实体对象(User):</o:p>
<o:p> 在Address类中添加User user;字段,并在User XML配置文件中的Component属性中添加子属性</o:p>
<parent name="user"/>
<o:p> </o:p>
<o:p> </o:p>
分享到:
相关推荐
《Java Persistence with Hibernate示例详解》 在Java开发领域,持久化是不可或缺的一部分,而Hibernate作为Java中最流行的ORM(对象关系映射)框架之一,它极大地简化了数据库操作。本篇将深入探讨“Java ...
《Java Persistence with Hibernate》是Java开发领域中一本深入探讨Hibernate持久化框架的重要著作。这本书由Christian Bauer和Gavin King合著,详细阐述了如何利用Hibernate进行数据库操作和对象关系映射(ORM)。 ...
《Java Persistence with Hibernate, 2nd Edition》是关于Java领域持久化技术的一本经典著作,主要聚焦于Hibernate框架的应用和深入理解。这本书详尽地介绍了如何利用Hibernate来处理Java应用程序中的对象关系映射...
《Java Persistence with Hibernate》是Java开发领域中一本深入探讨Hibernate框架的重要著作,它详细解析了如何在Java应用程序中实现持久化技术。这本书的第二版相较于第一版提供了更丰富的细节和更新的内容,使得...
《Java Persistence with Hibernate》是Java开发领域中一本权威的指南,尤其对于深入理解和应用Hibernate框架具有极高的价值。这本书的作者Gavin King是Hibernate的创始人,他的专业见解和实践经验为读者提供了深入...
- **第4章:复杂映射**:进一步探讨高级映射技巧,如一对多、多对多关系的处理。 - **第5章:查询语言**:详细介绍Hibernate提供的查询语言(HQL),包括基本查询、分页查询和动态查询等。 - **第6章:事务管理**:...
《Java Persistence with Hibernate》是Java开发领域中一本深入探讨Hibernate框架的权威著作。这本书由Christian Bauer和Gavin King合著,他们都是Hibernate项目的创始人和主要开发者。Hibernate是一个强大的开源...
《Java+Persistence+with+Hibernate》是一本深入探讨如何在Java应用程序中利用Hibernate进行持久化开发的指南。这本书主要关注于使用Hibernate框架来处理数据库交互,以实现对象关系映射(ORM)。Hibernate作为Java...
《Spring Persistence with Hibernate》这本书聚焦于使用Spring框架与Hibernate结合来构建强大且可靠的持久化解决方案,适用于企业级Java应用程序。Spring框架是一个全面的后端开发框架,而Hibernate则是一个流行的...
options in Hibernate and Java Persistence. We show you how to deal with inheritance, collections, and complex class associations. Finally, we discuss integration with legacy database schemas and some ...
《Java Persistence with Hibernate》是Manning出版社在2006年11月出版的一本专业书籍,专注于Java领域的持久化技术,尤其是Hibernate框架的应用。这本书深入探讨了如何使用Hibernate来处理Java应用程序中的数据存储...
《Java Persistence with Hibernate》第二版是一本深入探讨Java持久化技术与Hibernate框架的权威书籍。源代码提供了书中各个示例的实现,帮助读者更直观地理解理论知识,并能在实际项目中应用。在这个压缩包文件中,...
《Java Persistence with Hibernate》是Java开发领域中一本非常重要的书籍,专注于探讨如何使用Hibernate框架进行持久化操作。Hibernate是一款开源的对象关系映射(ORM)工具,它极大地简化了Java应用程序与数据库...
本书第四版的封面标题明确指出了其主要内容,即通过Spring Data和Hibernate这两个流行的Java框架来实现Java对象和数据库(包括关系型数据库和非关系型数据库)之间的持久化操作。 首先,要从本书中获益,读者需要...
《Java Persistence with Hibernate》是Manning出版社发布的一本专业书籍,专注于Java持久化技术,特别是Hibernate框架的应用。这本书深入探讨了如何在Java应用程序中有效地管理数据持久化,从而实现数据库与应用...
《Java Persistence with Hibernate 第2版》是2015年发布的一本专注于Java持久层技术的书籍,主要探讨了如何使用Hibernate框架进行数据存储和管理。Hibernate是一个强大的对象关系映射(ORM)工具,它允许Java开发者...
此外,通过提到Java EE8,说明书中内容是基于Java的企业版第八版的标准,这是Java社区中用来开发企业级应用的规范和API集合。 在标签中提到的“Java 持久化 微服务 Microservices”进一步确认了书中的核心议题:...