关系映射级别注解

    xiaoxiao2021-03-26  29

    实体之间的映射关系

    1、一对一:一个公民对应一个身份证号码。 2、一对多(多对一):一个公民有多个银行账号。 3、多对多:一个学生可以有多个老师,一个老师有多个学生。

    1、一对一单向外键

    @OneToOne(cascade=CascadeType.All) @JoinColumn(name="pid",unique=true) 例子: student类 package com.txr.oto.fk; import java.util.Date; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; //学生实体类 @Entity public class Student { private int sid; private IdCard card; private String gender; private Date birthday; private String major; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="pid",unique=true) public IdCard getCard() { return card; } public void setCard(IdCard card) { this.card = card; } @Id @GeneratedValue public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public Student() { } public Student(IdCard card, String gender, Date birthday, String major) { this.card = card; this.gender = gender; this.birthday = birthday; this.major = major; } } IdCard类 package com.txr.oto.fk; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; //身份证类 @Entity public class IdCard { private String pid;//身份证号码 private String sname;//学生的姓名 @Id @GeneratedValue(generator="pid") @GenericGenerator(name="pid",strategy="assigned") @Column(length=18) public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public IdCard(String pid, String sname) { super(); this.pid = pid; this.sname = sname; } public IdCard() { } } 运行结果: 注意:注解要么全部写在字段上,要不全部写在getXX()方法上,千万不能混合使用否则会报如下错误 org.hibernate.MappingException: Could not determine type for: com.txr.oto.fk.IdCard, at table: Student, for columns: [org.hibernate.mapping.Column(card)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:314) at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292) at org.hibernate.mapping.Property.isValid(Property.java:239) at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:483) at org.hibernate.mapping.RootClass.validate(RootClass.java:270) at org.hibernate.cfg.Configuration.validate(Configuration.java:1329) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1791) at oto_fk.TestStudent.testOneTOneAnnocation(TestStudent.java:18) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

    2、一对一双向外键关联

    主控方的配置同一对一单向外键关联 @OneToOne(mappedBy="card")//被控方 双向关联,必须设置mappedBy属性。因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存。 将IdCard中添加Student的关联关系 package com.txr.oto.bfk; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import org.hibernate.annotations.GenericGenerator; //身份证类 @Entity public class IdCard { @Id @GeneratedValue(generator="pid") @GenericGenerator(name="pid",strategy="assigned") @Column(length=18) private String pid;//身份证号码 private String sname;//学生的姓名 @OneToOne(mappedBy="card") private Student stu; public Student getStu() { return stu; } public void setStu(Student stu) { this.stu = stu; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public IdCard(String pid, String sname) { super(); this.pid = pid; this.sname = sname; } public IdCard() { } } 运行结果:

    3、一对一单向外键联合主键

    创建主键类   主键类必须实现serializable接口,重写hashCode()和equals()方法。 主键类 @Embeddable 实体类 @EmbeddedId 具体的详细部分请参见上一章的属性级别注解

    4、多对一单向外键关联

    多方持有一方的引用,比如:多个学生对应一个班级(多对一) @ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER ) @JoinColumn(name="cid",referencedColumnName="CID") Student类 package com.txr.mto_fk; import java.util.Date; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; //学生实体类 @Entity public class Student { @Id private int sid; private String gender; private Date birthday; private String major; @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) @JoinColumn(name="cid",referencedColumnName="CID") private ClassRoom classRoom; public ClassRoom getClassRoom() { return classRoom; } public void setClassRoom(ClassRoom classRoom) { this.classRoom = classRoom; } public Student() { } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public Student(int sid, String gender, Date birthday, String major) { super(); this.sid = sid; this.gender = gender; this.birthday = birthday; this.major = major; } } ClassRoom类 package com.txr.mto_fk; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; //班级 @Entity public class ClassRoom { @Id @GeneratedValue(generator="cid") @GenericGenerator(name="cid",strategy="assigned") @Column(length=4) private String cid; private String cname; public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } public ClassRoom(String cid, String cname) { this.cid = cid; this.cname = cname; } public ClassRoom() { } } 测试: package mto_fk; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.Test; public class TestStudent { @Test public void testSchemaExport() { Configuration config=new Configuration().configure(); ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session=sessionFactory.openSession(); SchemaExport export =new SchemaExport(config); export.create(true,true); } } 测试结果:

    5、一对多单向外键关联

    一方持有多方的集合,一个班级有多个学生(一对多) @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY) @JoinColumn(name="cid") 总结:多对一时候,多方设置EAGER,一方设置LAZY student类 package com.txr.mto_bfk; import java.util.Date; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; //学生实体类 @Entity public class Student { @Id @GeneratedValue private int sid; private String name; private String gender; private Date birthday; private String major; public String getName() { return name; } public void setName(String name) { this.name = name; } public Student() { } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public Student(int sid, String name,String gender, Date birthday, String major) { this.sid = sid; this.name=name; this.gender = gender; this.birthday = birthday; this.major = major; } public Student(String name,String gender, Date birthday, String major) { this.name=name; this.gender = gender; this.birthday = birthday; this.major = major; } } 班级类 package com.txr.mto_bfk; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; //班级 @Entity public class ClassRoom { @Id @GeneratedValue(generator="cid") @GenericGenerator(name="cid",strategy="assigned") @Column(length=4) private String cid; private String cname; public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } public ClassRoom(String cid, String cname) { this.cid = cid; this.cname = cname; } public ClassRoom() { } } 测试类: @Test public void addStudentAndClass() { Configuration config=new Configuration().configure(); ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session=sessionFactory.openSession(); ClassRoom classRoom=new ClassRoom("1603", "软件三班"); Student student=new Student("txr","女", new Date(), "软件工程"); Student student1=new Student("xqh","女", new Date(), "软件工程"); student.setClassRoom(classRoom); student1.setClassRoom(classRoom); session.save(classRoom); session.save(student1); session.save(student); Transaction transaction=session.beginTransaction(); transaction.commit(); } 运行结果

    6、一对多双向外键关联

    在双方添加注解

    7、多对多单向外键关联

    学生和教师构成多对多的关联关系。 其中一个多方持有另一个多方的集合对象(学生持有教师的集合) 创建中间表 //学生类 @ManyToMany @JoinTable( name="teachers_students",//中间表表名 joinColumns={@JoinColumn(name="tid")},//这俩个指定相应控制类字段 inverseJoinColumns={@JoinColumn(name="tid")} ) Student类 package com.txr.mtm_fk; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; //学生实体类 @Entity public class Student { @Id @GeneratedValue private int sid; private String name; private String gender; private Date birthday; private String major; @ManyToMany @JoinTable( name="teachers_students", joinColumns={@JoinColumn(name="sid")}, inverseJoinColumns={@JoinColumn(name="tid")} ) private Set<Teacher> teachers=new HashSet<Teacher>(); public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student() { } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public Student(int sid, String name,String gender, Date birthday, String major) { this.sid = sid; this.name=name; this.gender = gender; this.birthday = birthday; this.major = major; } public Student(String name,String gender, Date birthday, String major) { this.name=name; this.gender = gender; this.birthday = birthday; this.major = major; } } Teacher类 package com.txr.mtm_fk; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; //教师 @Entity public class Teacher { @Id @GeneratedValue(generator="tid") @GenericGenerator(name="tid",strategy="assigned") @Column(length=4) private String tid; private String tname; public String getTid() { return tid; } public void setTid(String tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public Teacher() { } public Teacher(String tid, String tname) { super(); this.tid = tid; this.tname = tname; } } 测试: @Test public void testStudent() { Configuration config=new Configuration().configure(); ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session=sessionFactory.openSession(); SchemaExport export=new SchemaExport(config); export.create(true,true); }运行结果 添加数据: @Test public void addTS() { Configuration config=new Configuration().configure(); ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session=sessionFactory.openSession(); Transaction transaction=session.beginTransaction(); Teacher t=new Teacher("001", "txr"); Teacher t1=new Teacher("002", "xqh"); Student s1=new Student("lyh", "男", new Date(), "软件工程"); Student s2=new Student("pha", "男", new Date(), "软件工程"); s1.getTeachers().add(t); s1.getTeachers().add(t1); s2.getTeachers().add(t); s2.getTeachers().add(t1); session.save(t1); session.save(t); session.save(s1); session.save(s2); transaction.commit(); session.close(); } 运行结果:

    8、多对多双向外键关联

    双方持有对方的集合对象,其中一方设置 //教师类 @ManyToMany(mappedBy="teachers") 另一方 //学生类 @ManyToMany @JoinTable( name="teachers_students", joinColumns={@JoinColumn(name="tid")} )
    转载请注明原文地址: https://ju.6miu.com/read-662258.html

    最新回复(0)