Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与属性和单向映射的多对多关系_Java_Sql_Hibernate_Annotations - Fatal编程技术网

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

Java 与属性和单向映射的多对多关系,java,sql,hibernate,annotations,Java,Sql,Hibernate,Annotations,我对Hibernate还很陌生,搜索了一段时间后,我的注释仍然有问题 我有三门课: AuftragsPosition AuftragspositionZuordung(联接表) 材料 我想在AuftragsPosition和Material之间建立多对多关系,并在联接表上增加一个属性。 附加属性menge应该可以在AuftragsPosition中访问。 我的材料应该不知道其他两个表 以下是我的课程: AuftragsPosition @实体 @表(name=“AUFTRAGSPOSITION”

我对Hibernate还很陌生,搜索了一段时间后,我的注释仍然有问题

我有三门课:

  • AuftragsPosition
  • AuftragspositionZuordung(联接表)
  • 材料
  • 我想在AuftragsPosition和Material之间建立多对多关系,并在联接表上增加一个属性。 附加属性menge应该可以在AuftragsPosition中访问。 我的材料应该不知道其他两个表

    以下是我的课程:

    AuftragsPosition
    @实体
    @表(name=“AUFTRAGSPOSITION”)
    公共类AuftragsPosition扩展了AbstractVersionIdentity{
    私人名单材料;
    @OneToMany(mappedBy=“position”,targetEntity=AuftragspositionZuordnung.class,cascade=CascadeType.ALL)
    公开名单{
    返回物质;
    }
    }
    
    AUFTRAGSPOSITIONZOURDNUNG
    @实体
    @表(name=“ZUORDNUNG_AUFTRAGSPOSITION”)
    公共类AuftragspositionZuordnung扩展了AbstractVersionIdentity{
    私人职位;
    私人材料;
    私有整数蒙格;
    @许多酮
    @JoinColumn(name=“AUFTRAGSPOSITION_ID”)
    公共AuftragsPosition getPosition(){
    返回位置;
    }
    @manytone(targetEntity=Material.class)
    @JoinColumn(name=“MATERIAL\u ID”)
    公共材料getMaterial(){
    退料;
    }
    @列(name=“ANZAHL”)
    公共整数getMenge(){
    返回菜单;
    }
    }
    
    你知道我应该如何注释这些类吗

    谢谢和亲切的问候,
    Kevin

    我会在
    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
    @CollectionTable(name=“MENGEN”,
    joinColumns=@JoinColumn(name=“AUFTRAGSPOS_ID”))
    @MapKeyJoinColumn(name=“MATERIAL”)
    @列(name=“AMOUNT”)
    私有映射数量=新HashMap();
    
    您只需要
    @ElementCollection
    注释。我已经包括了其他人来演示如何操作默认的表和列命名


    我假设您希望按
    材质
    ,而不是按数量设置关键帧-这将更改所需的注释。

    您可以创建一个联接类(
    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;
        }
    }
    
    现在,主键是:

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

    检查此帮助是否允许您指定哪些类之间应该有多对多关系,以及您希望关系属性在哪个类中可用?@Lakshmi-恐怕链接已过时。你可以用地图为关系属性建模。@Lakshmi-我看到了你的链接,但对我没有帮助。@kostja-我已经用你要求的信息编辑了我的帖子。谢谢你的回答,它帮了我很大的忙!
    @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;
        }
    
    }