2011-04-12 75 views
1

我正在建模一个数据库。
TRIPLE其中包含三个CONCEPT。所以类TRIPLE的主键是三个uri在一起。 (一个概念可能在不同的TRIPLE)。
另外TRIPLE与另一个类,ANNOTATION有关,这里是问题,triple_id怎么能被识别?但首先,如果构建此Id组合是正确的。 为模型:Hibernate @id复合

Concept.java

@Entity 
@Table(name = "concept") 
public class Concept implements java.io.Serializable { 

    private static final long serialVersionUID = 1L; 
    private String id; 
    private List<TripleDBModel> triples; 
@ManyToMany(
      cascade={CascadeType.ALL}, 
      fetch=FetchType.LAZY, 
      mappedBy = "concepts" 
    ) 
    public List<TripleDBModel> getTriples() { 
     return triples; 
    } 

    public void setTriples(List<TripleDBModel> triples) { 
     this.triples = triples; 
    } 

ConceptPk.java

@Embeddable 
public class ConceptPk implements java.io.Serializable { 

    private static final long serialVersionUID = 1L; 
    private String uri; 

    public ConceptPk(String uri, String label){ 
     this.uri = uri; 
    } 

    public ConceptPk(){ 
     super(); 
    } 

    @Id 
    @Column(name = "uri", length = 100, unique = true, nullable = false) 
    public String getUri() { 
     return uri; 
    } 
    public void setUri(String uri) { 
     this.uri = uri; 
    } 
} 

Triple.java

@Entity 
@IdClass(ConceptPk.class) 
@Table(name = "triple") 
public class TripleDBModel { 

    protected List<Annotation> annotations; 
    protected String conceptUriSubject; 
    protected String conceptUriObject; 
    protected String conceptUriPredicate; 



    @ManyToMany(
      cascade={CascadeType.ALL}, 
      fetch=FetchType.LAZY 
    ) 
    @JoinTable(name = "triple_has_concept", 
      [email protected](name="uri"), 
      [email protected](name="triple_id")) //What shoul I write here??? 
    public List<Annotation> getAnnotations() { 
     return annotations; 
    } 
    public void setAnnotations(List<Annotation> annotations) { 
     this.annotations = annotations; 
    } 
    @Id public String getConceptUriSubject() { 
     return conceptUriSubject; 
    } 
    public void setConceptUriSubject(String conceptUriSubject) { 
     this.conceptUriSubject = conceptUriSubject; 
    } 
    @Id public String getConceptUriObject() { 
     return conceptUriObject; 
    } 
    public void setConceptUriObject(String conceptUriObject) { 
     this.conceptUriObject = conceptUriObject; 
    } 
    @Id public String getConceptUriPredicate() { 
     return conceptUriPredicate; 
    } 
    public void setConceptUriPredicate(String conceptUriPredicate) { 
     this.conceptUriPredicate = conceptUriPredicate; 
    } 
} 

在此先感谢!

回答

2

你可以使用一个ID类是这样的:

class TripleId implements Serializable { 
    @Column(...) 
    private String conceptUriSubject; 

    @Column(...) 
    private String conceptUriObject; 
} 

而且使用它在人间:

@Entity 
@Table(name = "triple") 
public class TripleDBModel { 

    @EmbeddedId 
    private TripleId id; 
    ... 
} 

另外请注意,您可以提供多个连接列: inverseJoinColumns= {@JoinColumn(name="subjectUri"), @JoinColumn(name="objectUri"), ... }

+0

谢谢,我选择第二个选项和semms工作 – 2011-04-12 11:10:47