2016-05-07 5 views
1

私はこのような結合テーブルを持っていますmultimedia_featureデータベースウィザードからエンティティを作成する2.1 @ManyToMany、修正リストが不要です

ウィザードは、マルチメディアクラスのList属性が作成されます:私はちょうどManyToOneの関係を(一つの特徴は、多くのマルチメディアファイルを持つことができます)必要があるので

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

を、私はUNIQUEとしてmultimedia_oidフラグが立て。私は本当に多くの持っているので

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

: はこの後、ウィザードは、他の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; 
    ... 
    ... 

を作成し、最終的には、マルチメディアクラスの属性を追加しましたクラスに参加すると、これらのクラスをすべて作成することは避けています。

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

またはこれが正しい持続性を排除: iは、手動のような属性を作成できますか?

答えて

2

Multimediaクラスのフィーチャ属性が@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の "null"の値をたくさん持っているだろう...私はそれは良い練習ではないと思う、右?だから、最初の方法で、私はマルチメディアクラスで何を書かなければならないのですか? – Marco

+0

@ManyToOne(multimediaListによってマップされる) ? – Marco

+0

@Marco結合表と双方向結合を保持する必要がある場合は、マルチメディアを所有側として使用し、そこに結合を定義し、フィーチャーであるもう一方の端にmappedBy属性を使用できます。私はデモのために私の答えを微調整しました。 –

関連する問題