簡體   English   中英

具有屬性和單向映射的多對多關系

[英]Many-To-Many relationship with Attributes and unidirectional mapping

我是Hibernate的新手,經過一段時間的搜索,我的注釋仍然存在問題。

我有3節課:

  1. AuftragsPosition
  2. AuftragspositionZuordung(聯接表)
  3. 材料

我想要AuftragsPositionMaterial之間具有多對多關系,並在聯接表上具有附加屬性。 附加屬性菜單應可在AuftragsPosition中訪問。 我的資料應該不了解其他兩個表。

這是我的課程:

AuftragsPosition

@Entity
@Table(name = "AUFTRAGSPOSITION")
public class AuftragsPosition extends AbstractVersionedEntity<Long> {

    private List<Material> materialien;

    @OneToMany(mappedBy = "position", targetEntity = AuftragspositionZuordnung.class, cascade = CascadeType.ALL)
    public List<Material> getMaterialien() {
        return materialien;
    }
}

地位

@Entity
@Table(name = "ZUORDNUNG_AUFTRAGSPOSITION")
public class AuftragspositionZuordnung extends AbstractVersionedEntity<Long> {

    private AuftragsPosition position;

    private Material material;

    private Integer menge;

    @ManyToOne
    @JoinColumn(name = "AUFTRAGSPOSITION_ID")
    public AuftragsPosition getPosition() {
        return position;
    }

    @ManyToOne(targetEntity = Material.class)
    @JoinColumn(name = "MATERIAL_ID")
    public Material getMaterial() {
        return material;
    }

    @Column(name = "ANZAHL")
    public Integer getMenge() {
        return menge;
    }
}

您知道如何注釋這些課程嗎?

謝謝你,凱文

我會將地圖添加到AuftragsPosition類中,看起來像這樣:

@ElementCollection
@CollectionTable(name = "MENGEN",
        joinColumns = @JoinColumn(name = "AUFTRAGSPOS_ID"))
@MapKeyJoinColumn(name = "MATERIAL") 
@Column(name = "AMOUNT")
private Map<Material, Integer> amounts = new HashMap<Material, Integer>();

您只需要@ElementCollection批注。 我已經包括了其他內容,以演示如何操作默認的表和列命名。

我假設您要按Material而不是按數量進行鍵輸入-這將更改所需的注釋。

您可以創建一個可以包含額外屬性menge類( AuftragsPositionMaterial )。

@Entity
@Table(name = "AUFTRAGSPOSITION")
public class AuftragsPosition extends AbstractVersionedEntity<Long> {

    private Set<AuftragsPositionMaterial> auftragsPositionMaterials = new HashSet<AuftragsPositionMaterial>();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.auftragsposition", cascade=CascadeType.ALL)
    public Set<AuftragsPositionMaterial> getAuftragsPositionMaterials() {
        return auftragsPositionMaterials;
    }
}

聯接類:

@Entity
@Table(name = "AuftragsPosition_Material")
@AssociationOverrides({
        @AssociationOverride(name = "pk.auftragsPosition", 
            joinColumns = @JoinColumn(name = "AUFTRAGSPOSITION_ID")),
        @AssociationOverride(name = "pk.material", 
            joinColumns = @JoinColumn(name = "MATERIAL_ID")) })
public class AuftragsPositionMaterial {

    private AuftragsPositionMaterialID pk = new AuftragsPositionMaterialID();

    @Column(name = "MENGE")
    private String menge;

    @EmbeddedId
    public AuftragsPositionMaterialID getPk() {
        return pk;
    }

}

現在,主鍵:

@Embeddable
public class AuftragsPositionMaterialID implements java.io.Serializable {

    private AuftragsPosition auftragsPosition;
    private Material material;

    @ManyToOne
    public Stock getAuftragsPosition() {
        return auftragsPosition;
    }

    public void setAuftragsPosition(AuftragsPosition auftragsPosition) {
        this.auftragsPosition= auftragsPosition;
    }

    @ManyToOne
    public Material getMaterial() {
        return material;
    }

    public void setMaterial(Material material) {
        this.material= material;
    }

}

暫無
暫無

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

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