之前记过配置文件方式的关联映射 可以参考:http://blog.csdn.net/su1573/article/details/74615709 现在记一下,用注解方式写的关联映射
只在多端配置; 多端:
@Entity(name="TABLE_STU") //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table public class Student { private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; //单向多对一 private Classes classes; @Id //该属性为主键 @GeneratedValue(strategy=GenerationType.AUTO) //设置主键生成规则,AUTO为数据库默认生成主键 // @GeneratedValue(strategy=GenerationType.IDENTITY) //设置主键生成规则,IDENTITY使用数据库自增列来生成主键,适用于MySQL,SqlServer,DB2等 // @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="stuSeq") //SEQUENCE使用序列作为主键生成规则,适用于Oracle,DB2等 // @SequenceGenerator(name="stuSeq",sequenceName="STU_SEQ",initialValue=1,allocationSize=1) //产生一个名为STU_SEQ的新序列,主键引用这个新序列 //initialValue从1开始,allocationSize每次加一 // @GeneratedValue(generator="currGen") //引用名为currGen的主键为生成规则, // @GenericGenerator(name="currGen",strategy="uuid") //strategy="uuid"为uuid方式产生主键,strategy="assigned"手动插入产生规则 @Column(name="STU_ID") //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中) public Integer getStuId() { //该属性对应的列名 return stuId; } public void setStuId(Integer stuId) { this.stuId = stuId; } @Column(name="STU_NAME",length=200) public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } @Column(name="STU_GENDER" ,length=50) public String getStuGender() { return stuGender; } public void setStuGender(String stuGender) { this.stuGender = stuGender; } @Column(name="STU_AGE") public Integer getStuAge() { return stuAge; } public void setStuAge(Integer stuAge) { this.stuAge = stuAge; } //单向多对一 @ManyToOne(targetEntity=Classes.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL) @JoinColumn(name="CLASSES_ID") //cascade={CascadeType.PERSIST,CascadeType.MERGE}不能级联增加,但是all 可以 //多对一 public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; } }一端:
@Entity(name="TABLE_CLASSES") public class Classes { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="CLASSES_ID") private Integer classesId; @Column(name="CLASSES_NAME") private String classesName; //一对多 // @OneToMany(targetEntity=Student.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL) //,mappedBy="classes"双向的时候写 // @JoinColumn(name="CLASSES_ID") // private Set<Student> stuSet = new HashSet<Student>(); //一对多 public Integer getClassesId() { return classesId; } public void setClassesId(Integer classesId) { this.classesId = classesId; } public String getClassesName() { return classesName; } public void setClassesName(String classesName) { this.classesName = classesName; } // public Set<Student> getStuSet() { // return stuSet; // } // public void setStuSet(Set<Student> stuSet) { // this.stuSet = stuSet; // } }只在一段配置; 一端:
@Entity(name="TABLE_CLASSES") public class Classes { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="CLASSES_ID") private Integer classesId; @Column(name="CLASSES_NAME") private String classesName; //一对多 @OneToMany(targetEntity=Student.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL) //,mappedBy="classes"双向的时候写 @JoinColumn(name="CLASSES_ID") private Set<Student> stuSet = new HashSet<Student>(); //一对多 public Integer getClassesId() { return classesId; } public void setClassesId(Integer classesId) { this.classesId = classesId; } public String getClassesName() { return classesName; } public void setClassesName(String classesName) { this.classesName = classesName; } public Set<Student> getStuSet() { return stuSet; } public void setStuSet(Set<Student> stuSet) { this.stuSet = stuSet; } }多端:
@Entity(name="TABLE_STU") //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table public class Student { private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; //单向多对一 // private Classes classes; @Id //该属性为主键 @GeneratedValue(strategy=GenerationType.AUTO) //设置主键生成规则,AUTO为数据库默认生成主键 // @GeneratedValue(strategy=GenerationType.IDENTITY) //设置主键生成规则,IDENTITY使用数据库自增列来生成主键,适用于MySQL,SqlServer,DB2等 // @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="stuSeq") //SEQUENCE使用序列作为主键生成规则,适用于Oracle,DB2等 // @SequenceGenerator(name="stuSeq",sequenceName="STU_SEQ",initialValue=1,allocationSize=1) //产生一个名为STU_SEQ的新序列,主键引用这个新序列 //initialValue从1开始,allocationSize每次加一 // @GeneratedValue(generator="currGen") //引用名为currGen的主键为生成规则, // @GenericGenerator(name="currGen",strategy="uuid") //strategy="uuid"为uuid方式产生主键,strategy="assigned"手动插入产生规则 @Column(name="STU_ID") //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中) public Integer getStuId() { //该属性对应的列名 return stuId; } public void setStuId(Integer stuId) { this.stuId = stuId; } @Column(name="STU_NAME",length=200) public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } @Column(name="STU_GENDER" ,length=50) public String getStuGender() { return stuGender; } public void setStuGender(String stuGender) { this.stuGender = stuGender; } @Column(name="STU_AGE") public Integer getStuAge() { return stuAge; } public void setStuAge(Integer stuAge) { this.stuAge = stuAge; } //单向多对一 // @ManyToOne(targetEntity=Classes.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL) // @JoinColumn(name="CLASSES_ID") //cascade={CascadeType.PERSIST,CascadeType.MERGE}不能级联增加,但是all 可以 //多对一 // public Classes getClasses() { // return classes; // } // public void setClasses(Classes classes) { // this.classes = classes; // } }在多端配置: @ManyToOne() @JoinColumn() 在一端配置: @OneToMany(….,mappedBy=”classes”) mappedBy属性如果设置则表明这一段放弃控制权 多端:
@Entity(name="TABLE_STU") //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table public class Student { private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; //单向多对一 private Classes classes; @Id //该属性为主键 @GeneratedValue(strategy=GenerationType.AUTO) //设置主键生成规则,AUTO为数据库默认生成主键 // @GeneratedValue(strategy=GenerationType.IDENTITY) //设置主键生成规则,IDENTITY使用数据库自增列来生成主键,适用于MySQL,SqlServer,DB2等 // @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="stuSeq") //SEQUENCE使用序列作为主键生成规则,适用于Oracle,DB2等 // @SequenceGenerator(name="stuSeq",sequenceName="STU_SEQ",initialValue=1,allocationSize=1) //产生一个名为STU_SEQ的新序列,主键引用这个新序列 //initialValue从1开始,allocationSize每次加一 // @GeneratedValue(generator="currGen") //引用名为currGen的主键为生成规则, // @GenericGenerator(name="currGen",strategy="uuid") //strategy="uuid"为uuid方式产生主键,strategy="assigned"手动插入产生规则 @Column(name="STU_ID") //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中) public Integer getStuId() { //该属性对应的列名 return stuId; } public void setStuId(Integer stuId) { this.stuId = stuId; } @Column(name="STU_NAME",length=200) public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } @Column(name="STU_GENDER" ,length=50) public String getStuGender() { return stuGender; } public void setStuGender(String stuGender) { this.stuGender = stuGender; } @Column(name="STU_AGE") public Integer getStuAge() { return stuAge; } public void setStuAge(Integer stuAge) { this.stuAge = stuAge; } //单向多对一 @ManyToOne(targetEntity=Classes.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL) @JoinColumn(name="CLASSES_ID") //cascade={CascadeType.PERSIST,CascadeType.MERGE}不能级联增加,但是all 可以 //多对一 public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; } }一端:
@Entity(name="TABLE_CLASSES") public class Classes { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="CLASSES_ID") private Integer classesId; @Column(name="CLASSES_NAME") private String classesName; //一对多 @OneToMany(targetEntity=Student.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL) //,mappedBy="classes"双向的时候写 // @JoinColumn(name="CLASSES_ID") private Set<Student> stuSet = new HashSet<Student>(); //一对多 public Integer getClassesId() { return classesId; } public void setClassesId(Integer classesId) { this.classesId = classesId; } public String getClassesName() { return classesName; } public void setClassesName(String classesName) { this.classesName = classesName; } public Set<Student> getStuSet() { return stuSet; } public void setStuSet(Set<Student> stuSet) { this.stuSet = stuSet; } }两端都要写配置; 学生端:
@Entity(name="TABLE_TWOSTU") //Entity标识本类为一个POJO类,name属性代表由这个类映射生成的表名//@TABLE(name="TABLE_STU"),还有其他属性,用table public class TwoStudent { private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; private Set<Teacher> stuTea = new HashSet<Teacher>(); @Id //该属性为主键 @GeneratedValue(strategy=GenerationType.AUTO) //设置主键生成规则,AUTO为数据库默认生成主键 @Column(name="STU_ID") //括号中可以指定类型,columnDefinition="timestap",length,(insertable=false,增加数据时,这个列不出现在新增语句中) public Integer getStuId() { //该属性对应的列名 return stuId; } public void setStuId(Integer stuId) { this.stuId = stuId; } @Column(name="STU_NAME",length=200) public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } @Column(name="STU_GENDER" ,length=50) public String getStuGender() { return stuGender; } public void setStuGender(String stuGender) { this.stuGender = stuGender; } @Column(name="STU_AGE") public Integer getStuAge() { return stuAge; } public void setStuAge(Integer stuAge) { this.stuAge = stuAge; } @ManyToMany(targetEntity=Teacher.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL) @JoinTable(name="TABLE_TEA_STU",joinColumns={@JoinColumn(name="STU_ID")},inverseJoinColumns={@JoinColumn(name="TEA_ID")}) public Set<Teacher> getStuTea() { return stuTea; } public void setStuTea(Set<Teacher> stuTea) { this.stuTea = stuTea; } }教师端:
@Entity public class Teacher { private Integer teaId; private String teaName; private String teaPwd; private Set<TwoStudent> stuSet = new HashSet<TwoStudent>(); @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="TEA_ID") public Integer getTeaId() { return teaId; } public void setTeaId(Integer teaId) { this.teaId = teaId; } @Column(name="TEA_NAME", length=200,nullable=false) public String getTeaName() { return teaName; } public void setTeaName(String teaName) { this.teaName = teaName; } @Column(name="TEA_PWD", length=200,nullable=false) public String getTeaPwd() { return teaPwd; } public void setTeaPwd(String teaPwd) { this.teaPwd = teaPwd; } @ManyToMany(targetEntity=TwoStudent.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER) @JoinTable(name="TABLE_TEA_STU",joinColumns={@JoinColumn(name="TEA_ID")},inverseJoinColumns={@JoinColumn(name="STU_ID")}) public Set<TwoStudent> getStuSet() { return stuSet; } public void setStuSet(Set<TwoStudent> stuSet) { this.stuSet = stuSet; } }两端也都要配置; 学生端:
@Entity(name="TABLE_THREESTU") public class ThreeStudent { private Integer stuId; private String stuName; private String stuGender; private Integer stuAge; private StudentCard studentCard; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="STU_ID") public Integer getStuId() { return stuId; } public void setStuId(Integer stuId) { this.stuId = stuId; } @Column(name="STU_NAME",length=200) public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } @Column(name="STU_GENDER",length=50) public String getStuGender() { return stuGender; } public void setStuGender(String stuGender) { this.stuGender = stuGender; } @Column(name="STU_AGE") public Integer getStuAge() { return stuAge; } public void setStuAge(Integer stuAge) { this.stuAge = stuAge; } @OneToOne(targetEntity=StudentCard.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER) @PrimaryKeyJoinColumn public StudentCard getStudentCard() { return studentCard; } public void setStudentCard(StudentCard studentCard) { this.studentCard = studentCard; } }学生卡端:
@Entity(name="TAB_CARD") public class StudentCard { private Integer cardId; private String cardNum; private ThreeStudent threeStudent; @Id @GeneratedValue(generator="cardStuKey") @GenericGenerator(name="cardStuKey",strategy="foreign",parameters=@Parameter(name="property", value="threeStudent")) @Column(name="CARD_ID") public Integer getCardId() { return cardId; } public void setCardId(Integer cardId) { this.cardId = cardId; } @Column(name="CARD_NUM",length=200) public String getCardNum() { return cardNum; } public void setCardNum(String cardNum) { this.cardNum = cardNum; } @OneToOne(targetEntity=ThreeStudent.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="studentCard") @PrimaryKeyJoinColumn public ThreeStudent getThreeStudent() { return threeStudent; } public void setThreeStudent(ThreeStudent threeStudent) { this.threeStudent = threeStudent; } }配置文件中需要写:
<mapping class="com.su.domain.Student"/> <mapping class="com.su.domain.Classes"/> <mapping class="com.su.domain.Teacher"/> <mapping class="com.su.domain.TwoStudent"/> <mapping class="com.su.domain.ThreeStudent"/> <mapping class="com.su.domain.StudentCard"/>然后运读取配置文件的代码,即可在数据库自动建表:
public class HibernateTest { public static void main(String[] args) { // 默认读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); // 生成并输出sql到文件(当前目录)和数据库 SchemaExport se = new SchemaExport(cfg); // 创建表结构,第一个true 表示在控制台打印sql语句,第二个true 表示导入sql语句到数据库 se.create(true, true); } }控制台显示成功信息如下:
INFO: HHH000046: Connection properties: {user=ssss, password=****} 七月 09, 2017 10:45:45 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH000006: Autocommit mode: false 七月 09, 2017 10:45:45 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure INFO: HHH000115: Hibernate connection pool size: 1 (min=1) drop table TABLE_TEA_STU cascade constraints drop table TABLE_TWOSTU cascade constraints drop table Teacher cascade constraints drop sequence hibernate_sequence create table TABLE_TEA_STU ( STU_ID number(10,0) not null, TEA_ID number(10,0) not null, primary key (TEA_ID, STU_ID) ) create table TABLE_TWOSTU ( STU_ID number(10,0) not null, STU_AGE number(10,0), STU_GENDER varchar2(50 char), STU_NAME varchar2(200 char), primary key (STU_ID) ) create table Teacher ( TEA_ID number(10,0) not null, TEA_NAME varchar2(200 char) not null, TEA_PWD varchar2(200 char) not null, primary key (TEA_ID) ) alter table TABLE_TEA_STU add constraint FK_dnnscrifuvtxpg4t3c9oo1aaq foreign key (TEA_ID) references Teacher alter table TABLE_TEA_STU add constraint FK_feeoifq2kgnybn2rvw4muoq8p foreign key (STU_ID) references TABLE_TWOSTU create sequence hibernate_sequence 七月 09, 2017 10:45:46 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH000030: Cleaning up connection pool [jdbc:oracle:thin:@localhost:1521:xe] 七月 09, 2017 10:45:46 下午 org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: HHH000230: Schema export complete完结!!!
Author:su1573