簡體   English   中英

嵌套n:m + JPA屬性

[英]Nested n:m + attributes JPA

我在一個項目中有一個奇怪的需求。 連接兩個n:m + attributes表(我將使用虛擬屬性介紹行為)。

  1. FirstTable(idPlace,idAddress,idSchool,工資)加入了1:m;
  2. SecondTable(idPlace,idAddress,idSchool,qty,idEnterprise)

編輯(示例架構): 在此處輸入圖片說明

當然,我有表Place,Address,School,Enterprise,以及在實體類中實現的各自的ID,獲取,集合和屬性。

碼:

地點

@Entity
@Table(name = "Place")
public class Place implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idLine")
private Long idLine;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.place")
private List<FirstTable> firstTables;
}

地址

@Entity
@Table(name = "Address")
public class Address implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idAddress")
private Long idAddress;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.address")
private List<FirstTable> firstTables;
}

學校

@Entity
@Table(name = "School")
public class School implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idSchool")
private Long idSchool;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.school")
private List<FirstTable> firstTables;
}

第一表

@Entity
@Table(name = "FirstTable")
@AssociationOverrides({ @AssociationOverride(name = "pk.school", joinColumns = @JoinColumn(name = "idSchool")),
    @AssociationOverride(name = "pk.address", joinColumns = @JoinColumn(name = "idAddress")),
    @AssociationOverride(name = "pk.place", joinColumns = @JoinColumn(name = "idPlace")) })
public class FirstTable implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@EmbeddedId
protected FirstTablePK pk = new FirstTablePK();
 }

第一表PK

@Embeddable
public class FirstTablePK implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;
@ManyToOne
private Address address;
@ManyToOne 
private Place place;
@ManyToOne 
private School school;
}

上面提到的表和聯接工作正常。 現在,我想將FirstTable與Second Table連接起來。

企業

@Entity
@Table(name = "Enterprise")
public class Enterprise implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idEnterprise")
private Long idEnterprise;

@OneToMany(獲取= FetchType.LAZY,級聯= CascadeType.ALL,mappedBy =“ pk.enterprise”)私有列表secondTables; }

現在,對於SecondTable,我遵循相同的邏輯來連接到Enterprise。 為了與FirstTable連接,我嘗試了以下方法:

@Entity
@Table(name = "SecondTable")
@AssociationOverrides({
        @AssociationOverride(name = "pk.firstTable", joinTable = @JoinTable(
                name = "FirstTable", inverseJoinColumns = {
                @JoinColumn(name = "idSchool", referencedColumnName = "idSchool"),
                @JoinColumn(name = "idAddress", referencedColumnName = "idAddress"),
                @JoinColumn(name = "idPlace", referencedColumnName = "idPlace") })),
        @AssociationOverride(name = "pk.enterprise", joinColumns = @JoinColumn(name = "idEnterprise")) })
public class SecondTable implements Serializable{}

我的注釋中無法正常工作,我正在嘗試對FirstTable表進行inverseJoin。 編譯顯示此錯誤:

"org.hibernate.AnnotationException: A component cannot hold properties split into 2 different tables"

我試圖提供一個MV示例。 在此先感謝您,我真的需要您的幫助。

數小時后,在我設法解決問題之前進行了許多嘗試。 實際上,解決方案比我最初考慮的要簡單得多。

這里是:

 @AssociationOverride(name = "pk.firstTable", joinColumns = {
            @JoinColumn(name = "idSchool"),
            @JoinColumn(name = "idAddress"),
            @JoinColumn(name = "idPlace") }),
    @AssociationOverride(name = "pk.enterprise", joinColumns = @JoinColumn(name = "idEnterprise")) })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM