【问题标题】:JPA relation between two classes两个类之间的JPA关系
【发布时间】:2016-05-17 11:02:12
【问题描述】:

我的任务是构建一个包含标题和行的文档。 例如,包含标题(日期、库存)和行(材料、数量、价格、总和)的库存收入文档。我的问题是我不确定我的类架构是否正确。代码在这里(JPA + Hibernate):

@Entity
@Table
public class Document extends BaseEntity {
@Column
@Temporal(TemporalType.DATE) 
private Date date;
@Column
@Temporal(TemporalType.DATE) 
private Date createDate;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<DocumentRow> rows;
...
}

public class DocumentRow extends BaseEntity {
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Document document;
@Column(nullable = false, unique = true)
private Integer row;
...
}

@MappedSuperclass
public abstract class BaseEntity implements Serializable {

private static final long serialVersionUID = 8171308450531596347L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; ...}

【问题讨论】:

    标签: hibernate jpa many-to-one mappedsuperclass


    【解决方案1】:

    您正在执行双向映射,并且无法组合 @ManyToOne@ManyToMany,尽管您正在应用逻辑,但 sql 不正确,因为:

    @ManyToMany 会产生一个关联表 ManyToOne 只是另一个实体上父实体的外键。

    如果DocumentRow 元素可以在两个不同的Document 之间共享,那么您需要一个ManyToMany 关系,这将导致创建一个joinTable,如果您愿意,您必须更改DocumentRow 表上的@ManyToOne双向关系:

    @ManyToMany
    private List<Document> documents;
    

    如果不是这种情况并且DocumentRow 只属于一个文档,那么您需要将父类Document 上的映射从@ManyToMany 更改为@OneToMany

    @Entity
    @Table
    public class Document extends BaseEntity {
    @Column
    @Temporal(TemporalType.DATE) 
    private Date date;
    @Column
    @Temporal(TemporalType.DATE) 
    private Date createDate;
    @OneToMany(mappedBy="document",...)
    private Set<DocumentRow> rows;
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多