如何从连接表创build多个到多个Hibernate映射的附加属性?
我需要一个多对多的Hibernate映射,需要3个连接。 我试图find一个没有像LecturerCourse
这样的中间实体的解决scheme。
在我的讲师和课程表之间,我的数据库中有很多关系。 一个讲座可以由几个讲师给,而讲师可以给几个课程。
我有课前存储的课程。 但是,我需要给讲师分配课程。 当我分配课程时,我也储存了这门课程的能力。
我的数据库图表:
我用冬眠和spring。 当课程分配任何讲师时,我需要一个hibernate映射。 我需要为容量字段添加值。
我的讲师映射:
@Entity @Table(name="LECTURER") public class Lecturer { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LECTURER_ID_SEQ") @SequenceGenerator(name="LECTURER_ID_SEQ", sequenceName="LECTURER_ID_SEQ") private Long Id; @Column(name="NAME") private String name; @Column(name="SURNAME") private String surname; @Column(name="EMAIL") private String email; @Column(name="USERNAME") private String username; @Column(name="PASSWORD") private String Password; @ManyToMany @JoinTable( name="LECTURER_COURSE", joinColumns=@JoinColumn(name="LECTURER_ID"), inverseJoinColumns=@JoinColumn(name="COURSE_ID") ) private List<Course> courses; //getters - setters }
我的课程地图:
@Entity @Table(name="COURSE") public class Course { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COURSE_ID_SEQ") @SequenceGenerator(name="COURSE_ID_SEQ", sequenceName="COURSE_ID_SEQ") private Long id; @Column(name="NAME") private String name; @Column(name="CODE") private String code; }
任何想法如何解决我的问题?
你需要使用@EmbeddedId
和@Embeddable
注解来解决这个问题:
讲师class级:
@Entity @Table(name="LECTURER") public class Lecturer { @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.lecturer", cascade=CascadeType.ALL) Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); //all others properties Setters and getters are less relevant. }
课程等级:
@Entity @Table(name="COURSE") public class Course { @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.course", cascade=CascadeType.ALL) Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); //all others properties Setters and getters are less relevant. }
讲师课程类别:
@Entity @Table(name = "lecturer_course") @AssociationOverrides({ @AssociationOverride(name = "pk.lecturer", joinColumns = @JoinColumn(name = "LECTURER_ID")), @AssociationOverride(name = "pk.course", joinColumns = @JoinColumn(name = "COURSE_ID")) }) public class LecturerCourse { private LecturerCourseID pk = new LecturerCourseID(); @Column(name = "CAPACITY", nullable = false, length = 10) private String capacity; @EmbeddedId public LecturerCourseID getPk() { return pk; } }
现在主键:
@Embeddable public class LecturerCourseID implements java.io.Serializable { private Lecturer lecturer; private Course course; @ManyToOne public Stock getLecturer() { return lecturer; } public void setLecturer(Lecturer lecturer) { this.lecturer= lecturer; } @ManyToOne public Course getCourse() { return course; } public void setCourse(Course course) { this.course= course; } }
现在你的主要应该是这样的:
Lecturer lecturer1 = new Lecturer(); Course math = new Course(); LecturerCourse lecturer1math = new LecturerCourse(); lecturer1math.setCapacity("capacity"); lecturer1math.setLecturer(lecturer1); lecturer1math.setCourse(math); lecturer1.getLecturerCourses().add(lecturer1math); //saving object session.save(lecturer1);
您需要确保标记为@Embeddable
类应该实现Serializable
标记接口。
希望它有帮助。
- 在Spring bean中启动新的事务
- 有没有更好的方法来检测一个Spring DB事务是否比使用TransactionSynchronizationManager.isActualTransactionActive()有效?
- 匹配的通配符是严格的,但是对元素“tx:annotation-driven”没有声明。
- 您在Spring MVC应用程序中使用什么命名约定?
- 如何使用2个或更多的数据库与spring?
- Spring @Transactional属性是否在私有方法上工作?
- 获取错误org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“springSecurityFilterChain”的bean
- Spring注释@Controller是否与@Service相同?
- spring:如何注入静态字段的值?