与属性和单向映射的多对多关系

时间:2013-12-20 09:31:56

标签: java sql hibernate annotations

我对Hibernate很新,在搜索了一段时间之后,我的注释仍然存在问题。

我有3个班级:

  1. AuftragsPosition
  2. AuftragspositionZuordung(连接表)
  3. 材料
  4. 我想在 AuftragsPosition Material 之间建立多对多关系,并在连接表上添加其他属性。 附加属性 menge 应该可以在 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;
        }
    }
    

    AuftragspositionZuordnung

    @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;
        }
    }
    

    你知道我应该如何注释这些类吗?

    谢谢和亲切的问候, 凯文

2 个答案:

答案 0 :(得分:0)

我会向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键入,而不是按金额键入 - 这会更改所需的注释。

答案 1 :(得分:0)

您可以创建一个可以包含额外属性AuftragsPositionMaterial的联接类(menge)。

@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;
    }

}