您的位置:首页 > 其它

day58:hibernate04_JPA注解方式实现hibernate CRUD--【用户添加角色没那摩神秘】

2017-09-22 16:40 501 查看
这个就是 “请记住我叫叶良辰”一样,先记住大概使用方法。熟练就行。

借鉴模板代码。有问题参考文档: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。】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: