a).hbm.xml配置如下:
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配置如下
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配置如下:
person
annotation 这种方式虽然API文档中给了例子,可是实践之后看不到两个实体之间有什么关联,两个实体可以单独保存数据,并不存在主键关联关系。通过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.)
annotation:
@Entity public class Customer implements Serializable { @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @JoinColumn(name="CUST_ID") public SetgetTickets() { ... } @Entity public class Ticket implements Serializable { ... //no bidir }
=================================================================================
=================================================================================
1、one-to-many单向表连接(推荐使用表连接):
annotation:
@Entity public class Trainer { @OneToMany @JoinTable( name="TrainedMonkeys", joinColumns = @JoinColumn( name="trainer_id"), inverseJoinColumns = @JoinColumn( name="monkey_id") ) public SetgetTrainedMonkeys() { ... } @Entity public class Monkey { ... //no bidir }
2、many-to-one单向表连接;
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差不多。
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单向表连接:
@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找到,用法都有详细的介绍。