`
clover灬
  • 浏览: 9311 次
  • 性别: Icon_minigender_1
  • 来自: 未来
社区版块
存档分类
最新评论

hibernate双向关联hbm.xml和annotation方式

阅读更多
1、one-to-many/many-to-one双向关联
hbm.xml配置方式:
<class name="Person">
	<id name="id" column="personId">
		<generator class="native"/>
	</id>
	<many-to-one name="address" column="addressId" not-null="true"/>
</class>
<class name="Address">
	<id name="id" column="addressId">
		<generator class="native"/>
	</id>
	<set name="people" inverse="true">
		<key column="addressId"/>
		<one-to-many class="Person"/>
	</set>
</class>

inverse="true" 表示不在己方维护关系,但是如果not-null="true"已经设置了,这里就没有作用了。
因为not-null="true"表示维护关系的一方该字段不能为空,必须首先插入一的一方。
----------------------------------------------------------------------------------------------------------------------------------------
What about the inverse mapping attribute? For you, and for Java, a bi-directional
link is simply a matter of setting the references on both sides correctly.
Hibernate, however, does not have enough information to correctly arrange SQL INSERT
and UPDATE statements (to avoid constraint violations). Making one side of the association
inverse tells Hibernate to consider it a mirror of the other side. That is all that is necessary
for Hibernate to resolve any issues that arise when transforming a directional navigation model
to a SQL database schema. The rules are straightforward: all bi-directional associations
need one side as inverse. In a one-to-many association it has to be the many-side,
and in many-to-many association you can select either side.
----------------------------------------------------------------------------------------------------------------------------------------

annotation注解方式:
@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
}


2、one-to-one基于外键关联:
hbm.xml配置:
<class name="Person">
	<id name="id" column="personId">
		<generator class="native"/>
	</id>
	<many-to-one name="address" column="addressId" unique="true" not-null="true"/>
</class>

<class name="Address">
	<id name="id" column="addressId">
		<generator class="native"/>
	</id>
	<one-to-one name="person" property-ref="address"/>
</class>

annotation注解方式:
@Entity
public class Customer implements Serializable {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="passport_fk")
    public Passport getPassport() {
        ...
    }

@Entity
public class Passport implements Serializable {
    @OneToOne(mappedBy = "passport")
    public Customer getOwner() {
    ...
}


one-to-one基于主键关联:
<class name="Person">
	<id name="id" column="personId">
		<generator class="native"/>
	</id>
	<one-to-one name="address"/>
</class>
<class name="Address">
	<id name="id" column="personId">
		<generator class="foreign">
			<param name="property">person</param>
		</generator>
	</id>
	<one-to-one name="person" constrained="true"/>
</class>


==================================================================================
================================以下是表连接方式====================================

1、one-to-many/many-to-one表连接
hbm.xml配置方式:
<class name="Person">
	<id name="id" column="personId">
		<generator class="native"/>
	</id>
	<set name="addresses" table="PersonAddress">
		<key column="personId"/>
		<many-to-many column="addressId" unique="true" class="Address"/>
	</set>
</class>

<class name="Address">
	<id name="id" column="addressId">
		<generator class="native"/>
	</id>
	<join table="PersonAddress" inverse="true" optional="true">
		<key column="addressId"/>
		<many-to-one name="person" column="personId" not-null="true"/>
	</join>
</class>

annotation注解方式:
@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
   @JoinTable(name="soldierTroop",
	   joinColumns=@JoinColumn(name="sid"),
	   inverseJoinColumns=@JoinColumn(name="tid"))
    public Troop getTroop() {
    ...
} 

2、one-to-one:配置文件基本一致,只不过在不需要维护关系的一方添加inverse="true".不常用!!!不推荐!!!
<class name="Person">
	<id name="id" column="personId">
		<generator class="native"/>
	</id>
	<join table="PersonAddress" optional="true">
		<key column="personId" unique="true"/>
		<many-to-one name="address" column="addressId" not-null="true" unique="true"/>
	</join>
</class>

<class name="Address">
	<id name="id" column="addressId">
		<generator class="native"/>
	</id>
	<join table="PersonAddress" optional="true" inverse="true">
		<key column="addressId" unique="true"/>
		<many-to-one name="person" column="personId" not-null="true" unique="true"/>
	</join>
</class>

annotation注解方式:
@Entity
public class Customer implements Serializable {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="passport_fk")
    public Passport getPassport() {
        ...
    }

@Entity
public class Passport implements Serializable {
    @OneToOne(mappedBy = "passport")
    public Customer getOwner() {
    ...
}

3、many-to-many:
hbm.xml注解方式:
<class name="Person">
	<id name="id" column="personId">
		<generator class="native"/>
	</id>
	<set name="addresses" table="PersonAddress">
		<key column="personId"/>
		<many-to-many column="addressId" class="Address"/>
	</set>
</class>

<class name="Address">
	<id name="id" column="addressId">
		<generator class="native"/>
	</id>
	<set name="people" inverse="true" table="PersonAddress">
		<key column="addressId"/>
		<many-to-many column="personId" class="Person"/>
	</set>
</class>

annotation注解方式:
@Entity
public class Employer implements Serializable {
    @ManyToMany(
        targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
        cascade={CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(
        name="EMPLOYER_EMPLOYEE",
        joinColumns=@JoinColumn(name="EMPER_ID"),
        inverseJoinColumns=@JoinColumn(name="EMPEE_ID")
    )
    public Collection getEmployees() {
        return employees;
    }
    ...
}               
@Entity
public class Employee implements Serializable {
    @ManyToMany(
        cascade = {CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy = "employees",
        targetEntity = Employer.class
    )
    public Collection getEmployers() {
        return employers;
    }
}
0
0
分享到:
评论

相关推荐

    自动生成Hibernate类文件和hbm.xml文件

    通过myeclipse自动生成Hibernate类文件和hbm.xml文件,链接数据库库自动生成

    hibernate annotations3.4.0 GA.rar

    都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm.xml映射方式

    Hibernate Annotation jar

    这里面包涵了需要用...都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm.xml映射方式

    Xdoclet生成*.hbm.xml映射文件

    随着Hibernate的发展,它推荐使用注解(Annotation)直接在Java类上进行ORM配置,取代了Xdoclet生成映射文件的方式。因此,尽管Xdoclet仍有一定的实用性,但在现代开发环境中,直接使用Hibernate注解已成为主流。 ...

    Hibernate多对多双向关联(annotation/xml)

    本主题将深入探讨使用Hibernate进行多对多双向关联的实现,既可以通过注解(Annotation)方式,也可以通过XML配置文件来完成。 首先,我们来看多对多关联的基本概念。在数据库设计中,当两个实体之间存在多个实例...

    Hibernate一对一双向外键关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对一双向外键关联是一种常见的关系映射方式,用于表示两个实体类之间一对一的关联关系。在这个场景下,每个实体都有一个引用指向另一个实体,形成双向关联。本篇文章将深入探讨...

    Hibernate多对多单向关联(annotation/xml)

    本篇将详细讲解如何使用Hibernate实现多对多单向关联,包括注解(Annotation)和XML配置方式。 一、多对多关联的基本概念 多对多关联意味着一个实体可以与多个其他实体关联,反之亦然。例如,学生和课程的关系,一...

    hibernate4.3.8的annotation及xml的一对多的双向案例

    本案例主要探讨的是Hibernate 4.3.8版本中如何使用注解和XML配置实现一对多的双向关联关系。这种关系在实际的业务场景中十分常见,例如一个用户可以有多个订单,一个订单对应一个用户。 首先,我们来看一下注解的...

    Hibernate-Annotation中文教程.pdf

    * 不需要定义持久化类对应的*.hbm.xml 文件,直接以注解方式写入在持久化类中来实现。 * 提供一种强大及灵活的方法来声明持久性映射。 要使用 Hibernate Annotation,您至少需要具备 Hibernate 3.2 和 Java 5。可以...

    Hibernate-Annotation初步.rar

    【描述】中提到的“Hibernate-Annotation”是指Hibernate框架中的一种元数据声明方式,它允许开发者通过在Java类和字段上直接使用注解(Annotation)来替代传统的XML配置文件(如*.hbm.xml)。这种做法显著提高了...

    Hibernate多对一单向关联(annotation/xml)

    以上就是使用Hibernate通过注解和XML配置实现多对一单向关联的详细步骤。在实际开发中,这种关联方式能够有效地简化数据操作,提高代码的可读性和可维护性。注意,根据项目需求,你可能还需要处理关联的懒加载或立即...

    Hibernate distribution and annotation

    2. **映射机制**: Hibernate支持XML映射文件(hbm.xml)和注解映射两种方式,让对象与数据库表之间建立映射关系。 3. **Session和Transaction**: Session是Hibernate的主要工作单元,负责保存、更新和检索对象。...

    springboot集成hibernate

    import org.springframework.context.annotation.Configuration; import org.springframework.orm.hibernate5.LocalSessionFactoryBean; import javax.sql.DataSource; @Configuration public class Hibernate...

    SSH整合-XML版和Annotation版

    XML版Spring通过bean配置文件(如applicationContext.xml)来声明和配置依赖关系,而Annotation版则允许在类或方法上使用注解如`@Component`、`@Service`、`@Autowired`等,使得配置更为简洁和直观。 **Hibernate**...

    Hibernate Annotation 学习笔记

    而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML配置文件的繁琐工作,使得开发过程更加简洁高效。本文将通过一个实际操作的实例,逐步介绍Hibernate Annotation的基础...

    Hibernate Annotation 中文文档

    这篇文档主要讨论的是Hibernate Annotation的使用方法,以及它如何替代传统的XML配置文件(*.hbm.xml)进行对象-关系映射。 **1. Hibernate Annotation简介** Hibernate Annotation是Hibernate框架的一个扩展,它...

    hibernate annotation jar

    5. XML与注解的对比:在Hibernate 3.3之前,配置通常通过XML文件完成,例如`hibernate.cfg.xml`和`hbm.xml`。虽然XML提供了灵活性和详细控制,但增加了大量的额外文件和代码。使用注解后,大部分配置可以直接写在...

    hibernate学习笔记.

    - **建立映射Helloworld.hbm.xml**:这是Hibernate的传统映射文件,用于定义Java类和数据库表之间的关系。 - **建立hibernate.cfg.xml**:这是Hibernate的配置文件,其中包含数据库连接信息以及对映射文件的引用。...

Global site tag (gtag.js) - Google Analytics