2016-05-07 24 views
1

我有一些像這樣的連接表multimedia_feature從數據庫嚮導創建實體jpa 2.1 @ManyToMany,不需要修復列表

嚮導將多媒體類中創建一個列表屬性:因爲我只需要一個多對一的關係(一個功能,可以有多個多媒體文件)

... 
@JoinTable(name = "multimedia_feature", joinColumns = { 
    @JoinColumn(name = "feature_oid", referencedColumnName = "oid")}, inverseJoinColumns = { 
    @JoinColumn(name = "multimedia_oid", referencedColumnName = "oid")}) 
@ManyToMany 
private List<Feature> featureList; 
... 

,我標記multimedia_oid具有唯一性。 在此之後,嚮導將創建其他2個表(我認爲redoundant)

@Entity 
@Table(name = "multimedia_feature") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "MultimediaFeature.findAll", query = "SELECT m FROM MultimediaFeature m"), 
    @NamedQuery(name = "MultimediaFeature.findByMultimediaOid", query = "SELECT m FROM MultimediaFeature m WHERE m.multimediaFeaturePK.multimediaOid = :multimediaOid"), 
    @NamedQuery(name = "MultimediaFeature.findByFeatureOid", query = "SELECT m FROM MultimediaFeature m WHERE m.multimediaFeaturePK.featureOid = :featureOid")}) 
public class MultimediaFeature implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected MultimediaFeaturePK multimediaFeaturePK; 
    @JoinColumn(name = "multimedia_oid", referencedColumnName = "oid", insertable = false, updatable = false) 
    @OneToOne(optional = false) 
    private Multimedia multimedia; 
    @JoinColumn(name = "feature_oid", referencedColumnName = "oid", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Feature feature; 
... 
... 

@Embeddable 
public class MultimediaFeaturePK implements Serializable { 

    @Basic(optional = false) 
    @NotNull 
    @Column(name = "multimedia_oid") 
    private int multimediaOid; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "feature_oid") 
    private int featureOid; 
    ... 
    ... 

最後將其加入多媒體類屬性:

.... 
@OneToOne(cascade = CascadeType.ALL, mappedBy = "multimedia") 
    private MultimediaFeature multimediaFeature; 
.... 

,因爲我真的有很多加入類,我會避免創建所有這些類。 我可以手動創建的屬性,如:

@JoinTable(name = "multimedia_feature", 
      @JoinColumn(name"feature_oid", referencedColumnName = "oid") 
) 
    @OneToOne(optional = false) 
    private Feature feature; 

或這排除了正確的持久性?

回答

2

它看起來多媒體類中的要素屬性應該是@ManyToOne關係。 默認情況下,爲多對多關係和單向一對多關係的映射創建連接表。 如果你想避免加入班級,我想你可以通過使用@JoinTable像映射功能類的多媒體屬性:

@OneToMany 
@JoinTable(name = "multimedia_feature", 
    joinColumns = @JoinColumn(name = "feature_oid"), 
    inverseJoinColumns = @JoinColumn(name = "multimedia_oid")) 
private List<Multimedia> multimediaList; 

如果確實需要使用連接表的雙向關係,映射會像這樣:

public class Feature implements Serializable { 
    @OneToMany(mappedBy="feature") 
    private List<Multimedia> multimediaList; 
    ... 
} 

public class Multimedia implements Serializable { 
    @ManyToOne 
    @JoinTable(name = "multimedia_feature", 
      joinColumns = @JoinColumn(name = "multimedia_oid") , 
      inverseJoinColumns = @JoinColumn(name = "feature_oid")) 
    private Feature feature; 
    ... 
} 

或者,您可以在多媒體桌子轉,連接列,就像feture_oid具有雙向關聯完全去掉連接表。所以,你可以很容易地映射在多媒體類的特徵屬性:

@ManyToOne 
@JoinColumn(name = "feature_oid") 
private Feature feature; 

而要素類將是這樣的:

@OneToMany(mappedBy="feature") 
private List<Multimedia> multimediaList; 
+0

我不能在多媒體添加一個屬性,因爲這個類有其他人加入表與其他類...如果我爲每個類添加一個屬性,我會在db中有很多「空」值...我認爲這不是一個好習慣,對吧?那麼,在第一種方式中,我必須在多媒體課程中寫什麼? – Marco

+0

@ManyToOne(由multimediaList映射) ? – Marco

+0

@Marco如果您確實需要保留連接表和雙向綁定,那麼您可以使用Multimedia作爲擁有方,並在其中定義連接,並在Feature的另一端使用mappedBy屬性。我調整了我的答案來演示。 –