2016-05-07 1 views
1

У меня есть некоторые таблицы объединения, подобные этому multimedia_feature.создать сущность из мастера базы данных jpa 2.1 @ManyToMany, список исправлений не нужен

Мастер создаст в категории класса атрибут List:

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

, так как я просто нужны отношения ManyToOne (одна функция может иметь много мультимедийных файлов), я помечено multimedia_oid, как UNIQUE. После этого мастер создает другие 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; 
.... 

, поскольку у меня действительно много join classes, я бы не стал создавать все эти классы. Могу ли я вручную создать атрибуты, такие как:

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

или это исключает возможность правильного упорства?

ответ

2

Он выглядит атрибутом функции в классе мультимедиа должно быть отношение @ManyToOne. По умолчанию таблицы соединений создаются для сопоставления отношений «многие ко многим» и однонаправленных отношений «один ко многим». Если вы хотите, чтобы избежать присоединиться к классу, я думаю, вы можете отобразить мультимедийный атрибут в классе Feature с помощью @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; 

И в классе Feature будет как:

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

я не могу добавить атрибут в мультимедиа, потому что этот класс имеет другие присоединиться таблица с другими классами ... если я добавлю атрибут для каждого класса, у меня будет много «нулевых» значений в db ... я думаю, что это не очень хорошая практика, не так ли? Итак, в первую очередь, что мне нужно писать в мультимедийном классе? – Marco

+0

@ManyToOne (отображается в списке мультимедиа) ? – Marco

+0

@Marco Если вам нужно сохранить таблицу соединений и двунаправленную связь, вы можете использовать Мультимедиа как принадлежащую стороне и определить ее там, и использовать атрибут mappedBy на другом конце, который является Feature. Я изменил свой ответ на демо. –

Смежные вопросы