Hibernate @id композитный - PullRequest
       3

Hibernate @id композитный

1 голос
/ 12 апреля 2011

Я моделирую базу данных.
Существует TRIPLE, который содержит три CONCEPT. Таким образом, первичный ключ класса TRIPLE - это три uri все вместе. (Одна концепция может быть в другом TRIPLE).
Также TRIPLE связан с другим классом, ANNOTATION, и вот вопрос, как можно идентифицировать triple_id ?? Но прежде всего, если построение этого 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", 
            joinColumns=@JoinColumn(name="uri"),
            inverseJoinColumns=@JoinColumn(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;
    }
}  

Заранее спасибо !!

1 Ответ

2 голосов
/ 12 апреля 2011

Вы можете использовать класс 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"), ... }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...