类定义如下:public class Category implements Serializable {
private Long id;
private String name;
private mypack.Category parentCategory;//指向所属类
private Set childCategories;//指向包含类
以上代码主要内容是说Category表自己引用自己做外键,比如说食品类包含水果类,水果类包含苹果类,其中函数
saveCategoryWithCascade() {} //建立西红柿类别和水果类别之间的关联关系 ,代码如下: tomatoCategory.setParentCategory(fruitCategory);
fruitCategory.getChildCategories().add(tomatoCategory);
而事实上西红柿是属于蔬菜类的,所以函数modifyCategoryAssociation(){} //建立西红柿类和蔬菜类之间的关联关系
代码如下:
tomatoCategory.setParentCategory(vegetableCategory);
vegetableCategory.getChildCategories().add(tomatoCategory);
//删除西红柿类和水果类之间的关联关系
fruitCategory.getChildCategories().remove(tomatoCategory);
tx.commit();个人觉得 fruitCategory.getChildCategories().remove(tomatoCategory); 这句话是否有些多余,因为
tomatoCategory.setParentCategory(vegetableCategory);
vegetableCategory.getChildCategories().add(tomatoCategory);
已经西红柿和蔬菜发生了关联关系(此时西红柿类的parentCategory属性已经指向蔬菜类),而解除删除西红柿类和水果类之间的关联关系在我理解是为了从水果类中的set对象中删除删除西红柿类,而我个人觉得这已经没有必要。很显然,在执行commit语句之前这3个对象都是持久状态的,如果不删除水果类中的set对象中的西红柿类,我将fruitCategory.getChildCategories().remove(tomatoCategory); 语句屏蔽掉了,查看数据库结果是完全一样的,
也并没有抛异常,我让苹果类的ParentCategory指向了蔬菜类,蔬菜类的set对象包含苹果类,而水果类的set对象也包含苹果类,我将有这样3个关系的对象持久到数据库,我运行的结果是和只包含苹果类的ParentCategory指向了蔬菜类,蔬菜类的set对象包含苹果类这两个关系的一对多双向关联是一样的,那么我想请问set属性标签有什么作用,因为在我们的表中是不存在set字段的,我们能通过set对象将对象持久到数据库吗,这样的双向关联显然没有意义,因为苹果不可能同时属于蔬菜和水果,它不可以有2个外键,set标签不能对应到数据库的表字段,那么set标签在这里又有什么用呢?
private Long id;
private String name;
private mypack.Category parentCategory;//指向所属类
private Set childCategories;//指向包含类
以上代码主要内容是说Category表自己引用自己做外键,比如说食品类包含水果类,水果类包含苹果类,其中函数
saveCategoryWithCascade() {} //建立西红柿类别和水果类别之间的关联关系 ,代码如下: tomatoCategory.setParentCategory(fruitCategory);
fruitCategory.getChildCategories().add(tomatoCategory);
而事实上西红柿是属于蔬菜类的,所以函数modifyCategoryAssociation(){} //建立西红柿类和蔬菜类之间的关联关系
代码如下:
tomatoCategory.setParentCategory(vegetableCategory);
vegetableCategory.getChildCategories().add(tomatoCategory);
//删除西红柿类和水果类之间的关联关系
fruitCategory.getChildCategories().remove(tomatoCategory);
tx.commit();个人觉得 fruitCategory.getChildCategories().remove(tomatoCategory); 这句话是否有些多余,因为
tomatoCategory.setParentCategory(vegetableCategory);
vegetableCategory.getChildCategories().add(tomatoCategory);
已经西红柿和蔬菜发生了关联关系(此时西红柿类的parentCategory属性已经指向蔬菜类),而解除删除西红柿类和水果类之间的关联关系在我理解是为了从水果类中的set对象中删除删除西红柿类,而我个人觉得这已经没有必要。很显然,在执行commit语句之前这3个对象都是持久状态的,如果不删除水果类中的set对象中的西红柿类,我将fruitCategory.getChildCategories().remove(tomatoCategory); 语句屏蔽掉了,查看数据库结果是完全一样的,
也并没有抛异常,我让苹果类的ParentCategory指向了蔬菜类,蔬菜类的set对象包含苹果类,而水果类的set对象也包含苹果类,我将有这样3个关系的对象持久到数据库,我运行的结果是和只包含苹果类的ParentCategory指向了蔬菜类,蔬菜类的set对象包含苹果类这两个关系的一对多双向关联是一样的,那么我想请问set属性标签有什么作用,因为在我们的表中是不存在set字段的,我们能通过set对象将对象持久到数据库吗,这样的双向关联显然没有意义,因为苹果不可能同时属于蔬菜和水果,它不可以有2个外键,set标签不能对应到数据库的表字段,那么set标签在这里又有什么用呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货