day58:hibernate04_JPA注解方式实现hibernate CRUD--【用户添加角色没那摩神秘】
2017-09-22 16:40
501 查看
这个就是 “请记住我叫叶良辰”一样,先记住大概使用方法。熟练就行。
借鉴模板代码。有问题参考文档:http://pan.baidu.com/s/1mhQ6BcW
最后才百度。
######JPA配置小结:
①一对一:(通常都在一张表里。抽出两张表自找麻烦====极少用到)
②一对多:客户-联系人
少的一方:客户
③多对多【看作两个一对多(相对于中间表,都是一)】:用户和角色(最常用的:用户和权限。)
用户:
角色:
========直接拿来用,借鉴。
注意:
①一对多,从表(含有外键)方,需要配置@JoinColumn。【外键列信息】
②多对多,被动方(角色)//用户添加角色。不需要配置@JoinTable。【中间表信息】配置@JoinTable注意一下语法。==直接拿来用,改改。
③配置了mappedBy属性的一方,放弃了外键维护。===相当于xml方式的inverse=“true”。
【不必深究,用处不多:
只是在删除主表记录时,配置主表,是否放弃外键维护。
### 放弃,主表记录删不掉;没有放弃(默认),从表外键会在主表记录删除后更新为null。】
借鉴模板代码。有问题参考文档:http://pan.baidu.com/s/1mhQ6BcW
最后才百度。
######JPA配置小结:
①一对一:(通常都在一张表里。抽出两张表自找麻烦====极少用到)
②一对多:客户-联系人
少的一方:客户
@Entity @Table(name="cst_customer") // jpa的注解都在【javax.persistence包】下面 public class Customer { @Id @Column(name="cust_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer cust_id;// '客户编号(主键)', @Column(name="cust_name") private String cust_name;//'客户名称(公司名称)', @Column(name="cust_source") private String cust_source;// '客户信息来源', @Column(name="cust_industry") private String cust_industry;// '客户所属行业', @Column(name="cust_level") private String cust_level;// '客户级别', @Column(name="cust_phone") private String cust_phone;// '固定电话', @Column(name="cust_mobile") private String cust_mobile;//'移动电话', // 有多的一方的集合(Set) /*targetEntity:对方的所属类型 mappedBy:自己在对方中的【属性名】。==###=【有mappedBy放弃维护外键。】当做inverse="true"来用*/ @OneToMany(targetEntity=Linkman.class,mappedBy="customer",cascade=CascadeType.REMOVE) private Set<Linkman> linkmans=new HashSet(); //====只看上面。先面试构造、get set多的一方:联系人
@Entity @Table(name="cst_linkman") public class Linkman { @Id @Column(name="lkm_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer lkm_id;// '联系人编号(主键)', @Column(name="lkm_name") // 数据库的字段名 private String lkm_name;// '联系人姓名', @Column(name="lkm_gender") // 数据库的字段名 private String lkm_gender;// '联系人性别', @Column(name="lkm_phone") // 数据库的字段名 private String lkm_phone;// '联系人办公电话', @Column(name="lkm_mobile") // 数据库的字段名 private String lkm_mobile;// '联系人手机', @Column(name="lkm_email") // 数据库的字段名 private String lkm_email;// '联系人邮箱', @Column(name="lkm_qq") // 数据库的字段名 private String lkm_qq;// '联系人qq', @Column(name="lkm_position") // 数据库的字段名 private String lkm_position;// '联系人职位', @Column(name="lkm_memo") // 数据库的字段名 private String lkm_memo;// '联系人备注' // 有个一的一方的对象 @ManyToOne(targetEntity=Customer.class,cascade=CascadeType.ALL) /* name:本表外键字段名。######【本表的外键名】 referencedColumnName:指向的主键字段名######【对方表的主键名】 ===二者可以不同!【从表的外键名和主表的主键名,本就可以不同。】 ==######=多对一,多的一方的配置:【 @JoinColumn()是固定格式,只能多加熟练】 ==######=理解了OK:【可以看作从表“追加的一列”:JoinColumn】 ==@JoinColumn(foreignKey="xxx"是用来修改外键的。(添加-取消) ) */ @JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id") private Customer customer;
③多对多【看作两个一对多(相对于中间表,都是一)】:用户和角色(最常用的:用户和权限。)
用户:
@Entity @Table(name="sys_user") public class User { @Id @Column(name="user_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer user_id;// '用户id', @Column(name="user_code") private String user_code;// '用户账号', @Column(name="user_name") private String user_name;// '用户名称', @Column(name="user_password") private String user_password;// '用户密码', @Column(name="user_state") private String user_state;// '1:正常,0:暂停', // 有一个角色的集合 @ManyToMany(targetEntity=Role.class,cascade=CascadeType.ALL) /*name:中间表名称 joinColumns:自己在中间表中的配置信息 inverseJoinColumns:对方在中间表的配置信息*/ @JoinTable( name="sys_user_role", joinColumns={ /*name:自己在中间表的外键字段名称 referencedColumnName:指向的主键字段名称*/ @JoinColumn(name="user_id",referencedColumnName="user_id") }, inverseJoinColumns={ /*name:对方在中间表的外键字段名称 referencedColumnName: 对方指向的主键字段名称*/ @JoinColumn(name="role_id",referencedColumnName="role_id") }) private Set<Role> roles=new HashSet();
角色:
@Entity @Table(name="sys_role") public class Role { @Id @Column(name="role_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer role_id;// 主键id @Column(name="role_name") private String role_name;// '角色名称', @Column(name="role_memo") private String role_memo;//'备注', // 有一个用户的集合 /*targetEntity:对方类型 mappedBy:自己在对方中的属性名*/ @ManyToMany(targetEntity=User.class,mappedBy="roles") private Set<User> users=new HashSet();
========直接拿来用,借鉴。
注意:
①一对多,从表(含有外键)方,需要配置@JoinColumn。【外键列信息】
②多对多,被动方(角色)//用户添加角色。不需要配置@JoinTable。【中间表信息】配置@JoinTable注意一下语法。==直接拿来用,改改。
③配置了mappedBy属性的一方,放弃了外键维护。===相当于xml方式的inverse=“true”。
【不必深究,用处不多:
只是在删除主表记录时,配置主表,是否放弃外键维护。
### 放弃,主表记录删不掉;没有放弃(默认),从表外键会在主表记录删除后更新为null。】
相关文章推荐
- 以用户登录、注册、添加删除修改为例,解析jdbcTemplate使用方式以及spring注解实现CRUD
- Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN基于注解方式
- Hibernate实例实现(注解方式)添加两张关系表
- hibernate注解方式实现复合主键
- hibernate注解方式实现一对多映射
- 2.2、Hibernate用注解方式实现一对多、多对多关系
- Hibernate分别使用XML方式与注解方式添加数据
- hibernate注解方式实现复合主键
- hibernate注解方式实现一对多映射
- Hibernate jpa 在实体类中对于时间的注解 在时间类型DATE 属性上添加一个 @Temporal(TemporalType.DATE)(精确到年月日) @Temporal(Tempora
- 使用Hibernate+struts实现添加用户和查看用户
- jQuery实现弹窗动态添加用户信息【详细注解】
- 一步步实现:JPA的基本增删改查CRUD(jpa基于hibernate)
- Hibernate3.X实现基于CLOB字段类型的注解方式:
- Hibernate中,One2Many和Many2One的双向映射关系的基于注解Annotation实现方式
- Java自学笔记之Hibernate-用注解方式实现一对多单项
- jpa hibernate(1) 多对多,用户新增,只增加中间表对应角色关系,不增加角色role
- Java自学笔记之Hibernate-用注解方式实现一对多双向关联
- hibernate注解方式实现一对多映射
- hibernate注解方式实现一对多映射