三個@Entity類Tc, Tracer, Track是三向關聯(lián)的的表, @Embeddable類TcTracer則存儲著三個表的ForeignKey
@Entity @Table(name= "tc", catalog="first_hiber") public class Tc { @org.hibernate.annotations.CollectionOfElements @JoinTable(name="tc_tracer", joinColumns=@JoinColumn(name="tc_id")) private Set<TcTracer> tcTracers = new HashSet<TcTracer>(); @Id @GeneratedValue @Column(name="tc_id", nullable= false) private Long id; }
@Embeddable @Table(name="tc_tracer") public class TcTracer { @org.hibernate.annotations.Parent private Tc tc;
@ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="tracer_id", nullable=false, updatable=false) private Tracer tracer; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="track_id", nullable=false, updatable=false) private Track track; }
如上,將TcTracer作為Tc的子元素,從而實現(xiàn)Tc的三相關聯(lián)。
用HQL可以通過特定的Tc,Tracer得到對應的所有Track:
select tctracers.track from Tc tc join tc.tcTracers tctracers where tc.name="tc name" and tctracers.tracer.name="tracer name"
List<Track> tracks = session.createQuery(HQL).list();