所有的单向和双向在数据库中么有区别,但是在代码两个实体之间有区别。 一对一关联 1.一对一的单向主键关联(不重要): 例如两张表:Husband和wife,在数据库中设置彼此的主键id相互关联(少用) 此时在两个实体类中不用添加任何的对象属性 2.一对一的单向外键关联 例如两张表:Husband和wife ***在设计实体类时建立联系: 对象模型:只在Husband类中添加属性private Wife wife;并生成getter和setter方法, 如果不使用多表关联查询HQL语句,那么要进行多表查询需在Husband实体类中再添加private int wifeid;属性, 这也是传统做法 关系模型:以Wife表为主导: 在Husband表中添加一个字段wifeid,该字段与wife表中的id建立关联关系 或者: 对象模型:只在Wife类中添加属性private Husband husband;并生成getter和setter方法, 如果不使用多表关联查询HQL语句,那么要进行多表查询需在Wife实体类中添加private int husbandid;属性,这也是传统做法 关系模型:以Husband表为主导: 在wife表中添加一个字段husbandid,该字段与husband表中的id建立关联关系 3.一对一的双向外键关联 对象模型:在Husband类中添加属性private Wife wife;并生成getter和setter方法,同时在 在Wife类中添加属性private Husband husband;并生成getter和setter方法 关系模型:两种主导关系建立任意一种即可,不必两种主导关系同时建: 以Wife表为主导:在Husband表中添加一个字段wifeid,该字段与wife表中的id建立关联关系 或者 以Husband表为主导:在wife表中添加一个字段husbandid,该字段与husband表中的id建立关 联关系 4.一对一双向主键关联----(不重要,此处不再介绍) ------------------------------------------------------------------------------------------- --- 总结:一对一单向和双向在数据库中的表现是一样的,区别体现在java程序中,单向只能找一次,双向 可以相互找到 ------------------------------------------------------------------------------------------- --- 一对多和多对一关联 ---- 原则:在多方添加外键 两张表:user表和group表 1.多对一的单向关联: 对象模型:根据在多方添加外键的构思:在多方User类中添加属性:private Group group; 关系模型:在user表中添加groupid字段,该字段和group表中的id关联 2.一对多的单向关联: 对象模型:在一的一方设置多方的集合属性:即在group中设置:private Set<User> users = new HashSet<User>();//此处最适合使用set集合,因为不会重复 关系模型:和多对一在数据库的表现一致,同样遵循在多方设置外键的思想,即在user表中添加groupid 字段,该字段和group表中的id关联 3.多对一(一对多)的双向关联: 对象模型:在单方添加集合属性,在多方添加对象属性 关系模型:和单向在数据库的表现一致,同样遵循在多方设置外键的思想,即在user表中添加groupid字 段,该字段和group表中的id关联 ------------------------------------------------------------------------------------------- --- 总结:数据库表现相同并遵循一个原则:在多方设置外键 一对多或者多对一的双向关联很少用,一般使用单向关联即可,即在多的一方设置联系, ------------------------------------------------------------------------------------------- --- 多对多关联 --- 增加中间表 两张表:teacher表和student表 1.多对多单向关联: 对象模型:在其中某一个实体类中设置set集合属性 关系模型:增加中间表,包含studentid和teacherid,并分别向两张表做关联 2.多对多双向关联: 对象模型:在两个实体类中均设置set集合属性 关系模型:和单向关联在数据库表现一致,增加中间表,包含studentid和teacherid,并分别向两张表 做关联 ------------------------------------------------------------------------------------------- ---- 总结:在数据库表现一致:增加中间表,类中设置set集合 ------------------------------------------------------------------------------------------- ---- -----------之前的BBS项目中数据库表设计: 新闻表和评论表: 1.如果要先查询新闻再查询评论,则确定两张表为一对多关系 2.如果想在查询评论的时候查询它属于哪个新闻,则确定关系为多对一 到底是一对多还是多对一对在数据库中的表现没有影响,都是在多方设置外键,但是在java类中的表现 不同, 是在一方添加set集合属性,还是在多方添加对象属性,这取决于关联关系,既然双向,单向在数据库中 表现一致, 那么在java类中建议设置成双向关联。 -------------------------------------------------------------------- 假如Group和User之间是一对多的双向关联,那么应该在User中设置Private Group group; 同时在Group中设置:private Set<User> users = new HashSet<>(); 然后就可以: User user1 = new User("张三",21); User user2 = new User("李四",20); Group group = new Group(); group.getUsers().add(user1); group.getUsers().add(user2); 然后创建集合List,list中每个元素为Group,查询即可。