从数据库向导 jpa 2.1 @ManyToMany 创建实体,不需要修复列表
create entity from database wizard jpa 2.1 @ManyToMany, fix list not needed
我有一些这样的连接表 multimedia_feature。
向导将在多媒体 class 中创建一个列表属性:
...
@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 个表(我认为多余)
@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;
...
...
终于在多媒体中添加了一个属性class:
....
@OneToOne(cascade = CascadeType.ALL, mappedBy = "multimedia")
private MultimediaFeature multimediaFeature;
....
因为我有很多 join classes,我会避免创建所有这些 classes。
我可以手动创建属性吗,比如:
@JoinTable(name = "multimedia_feature",
@JoinColumn(name"feature_oid", referencedColumnName = "oid")
)
@OneToOne(optional = false)
private Feature feature;
或者这妨碍了正确的持久性?
看来Multimedia中的feature属性class应该是@ManyToOne关系。
默认情况下,jointable是为多对多关系和单向一对多关系的映射而创建的。
如果你想避免连接 class,我认为你可以通过使用 @JoinTable 来映射功能 class 中的多媒体属性:
@OneToMany
@JoinTable(name = "multimedia_feature",
joinColumns = @JoinColumn(name = "feature_oid"),
inverseJoinColumns = @JoinColumn(name = "multimedia_oid") )
private List<Multimedia> multimediaList;
如果您确实需要与连接 table 的双向关系,映射将是这样的:
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;
...
}
或者您可以通过在多媒体 table 中引入连接列来完全删除具有双向关联的连接 table,例如 feture_oid。这样就可以很方便的在Multimedia中映射feature属性class:
@ManyToOne
@JoinColumn(name = "feature_oid")
private Feature feature;
并且在功能中 class 会像:
@OneToMany(mappedBy="feature")
private List<Multimedia> multimediaList;
我有一些这样的连接表 multimedia_feature。
向导将在多媒体 class 中创建一个列表属性:
...
@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 个表(我认为多余)
@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;
...
...
终于在多媒体中添加了一个属性class:
....
@OneToOne(cascade = CascadeType.ALL, mappedBy = "multimedia")
private MultimediaFeature multimediaFeature;
....
因为我有很多 join classes,我会避免创建所有这些 classes。 我可以手动创建属性吗,比如:
@JoinTable(name = "multimedia_feature",
@JoinColumn(name"feature_oid", referencedColumnName = "oid")
)
@OneToOne(optional = false)
private Feature feature;
或者这妨碍了正确的持久性?
看来Multimedia中的feature属性class应该是@ManyToOne关系。 默认情况下,jointable是为多对多关系和单向一对多关系的映射而创建的。 如果你想避免连接 class,我认为你可以通过使用 @JoinTable 来映射功能 class 中的多媒体属性:
@OneToMany
@JoinTable(name = "multimedia_feature",
joinColumns = @JoinColumn(name = "feature_oid"),
inverseJoinColumns = @JoinColumn(name = "multimedia_oid") )
private List<Multimedia> multimediaList;
如果您确实需要与连接 table 的双向关系,映射将是这样的:
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;
...
}
或者您可以通过在多媒体 table 中引入连接列来完全删除具有双向关联的连接 table,例如 feture_oid。这样就可以很方便的在Multimedia中映射feature属性class:
@ManyToOne
@JoinColumn(name = "feature_oid")
private Feature feature;
并且在功能中 class 会像:
@OneToMany(mappedBy="feature")
private List<Multimedia> multimediaList;