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

1、many-to-one单向关联:
a).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>
</class>

annotation配置:

@Entity()
public class Flight implements Serializable {
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinColumn(name="COMP_ID")
public Company getCompany() {
return company;
}
...
}

b).save保存数据有两种方式:先添加一的一方;先添加多的一方。最佳实践是添加一的一方。
不过,如果设置了not-null="true",就不能使用第二种方式了。而且,not-null是在建表的时候起作用!!
另外一点,如果使用了级联标签cascade="all|none|save-update|delete|all-delete-orphan|delet(6)e-orphan"时(多个以逗号隔开),会级联操作一的一方。

c).get/load many-to-one 默认使用懒加载,可以通过lazy="false"设置。如果先load一的一方,是没有办法获取到多的一方的数据的。
d).update没有实用价值,两张表只用id是相互关联的,其他没有任何关系。修改任意一张表另外一张表都是不可感知的。而id是不能修改的。
e).delete通过主键删除,只能删除多的一方。

2、one-to-one单向关联基于外键关联:在单向关联中,one-to-one和many-to-one基本一样,唯一不同的地方需要添加unique="true",其他没有区别,标签都是一样的。
a).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>
</class>

annotation:

@Entity
public class Customer implements Serializable {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="passport_fk")
public Passport getPassport() {
...
}
}

b).save和many-to-one也没有多大区别,只不过变成了一对一的关系。get/load、update、delete也和many-to-one一致。

3、one-to-one单向关联基于主键关联:
a).hbm.xml配置如下:

<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
</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>

annotation[color=red]这种方式虽然API文档中给了例子,可是实践之后看不到两个实体之间有什么关联,两个实体可以单独保存数据,并不存在主键关联关系[/color]。通过hbm.xml方式是正确的,被维护关系的一端不能单独保存数据:

@Entity
public class Body {
@Id
public Long getId() { return id; }

@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
public Heart getHeart() {
return heart;
}
...
}

b).通过主键关联,这种方式已经取消了!!!

4、one-to-many单向关联:这种方式是不推荐的。CRUD操作和many-to-one一样。
(A unidirectional one-to-many association on a foreign key is an unusual case, and is not recommended.
You should instead use a join table for this kind of association.)

<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<set name="addresses">
<key column="personId" not-null="true"/>
<one-to-many class="Address"/>
</set>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
</class>

annotation:

@Entity
public class Customer implements Serializable {
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="CUST_ID")
public Set<Ticket> getTickets() {
...
}

@Entity
public class Ticket implements Serializable {
... //no bidir
}

[color=red]=================================================================================
=================================================================================[/color]
1、one-to-many单向表连接(推荐使用表连接):

<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>
</class>

annotation:

@Entity
public class Trainer {
@OneToMany
@JoinTable(
name="TrainedMonkeys",
joinColumns = @JoinColumn( name="trainer_id"),
inverseJoinColumns = @JoinColumn( name="monkey_id")
)
public Set<Monkey> getTrainedMonkeys() {
...
}

@Entity
public class Monkey {
... //no bidir
}

2、many-to-one单向表连接;

<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"/>
</join>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
</class>

annotation方式:

@Entity
public class Flight implements Serializable {
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinTable(name="Flight_Company",
joinColumns = @JoinColumn(name="FLIGHT_ID"),
inverseJoinColumns = @JoinColumn(name="COMP_ID")
)
public Company getCompany() {
return company;
}
...
}


3、one-to-one单向表连接:基本不用,依旧和many-to-one差不多。

<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
</class>


annotation:

public class Body {

@OneToOne
@JoinTable(name="bodyHeart",
joinColumns=@JoinColumn(name="bid"),
inverseJoinColumns=@JoinColumn(name="hid"))
public Heart getHeart() {
return heart;
}
}


4、many-to-many单向表连接:

<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>
</class>


@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 {
.../no bidr
}


这些东西都是摘自hibernate的API文档,其实hibernate的东西都可以在hibernate的API找到,用法都有详细的介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值