【问题标题】:Many-To-Many relationship with Attributes and unidirectional mapping与属性和单向映射的多对多关系
【发布时间】:2013-12-20 09:31:56
【问题描述】:

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

我有 3 个课程:

  1. AuftragsPosition
  2. AuftragspositionZuordung(连接表)
  3. 材质

我想要 AuftragsPositionMaterial 之间的多对多关系以及连接表上的附加属性。 menge 的附加属性应该可以在 AuftragsPosition 中访问。 我的 Material 应该不知道其他两个表。

这是我的课程:

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

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

感谢和亲切的问候, 凯文

【问题讨论】:

  • stackoverflow.com/q/1476600/2006839 检查这是否有帮助
  • 您能否指定哪些类之间应具有多对多关系,以及您希望关系属性在哪些类中可用?
  • @Lakshmi - 恐怕链接已经过时了。您可以使用地图对关系属性进行建模。
  • @Lakshmi - 我看过你的链接,但对我没有帮助。
  • @kostja - 我已经用您要求的信息编辑了我的帖子。

标签: java sql hibernate annotations


【解决方案1】:

我会在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 键入,而不是数量 - 这会更改所需的注释。

【讨论】:

  • 感谢您的回答,帮助很大!
【解决方案2】:

您可以创建一个可以包含额外属性 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;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 2014-08-17
    • 1970-01-01
    • 2016-03-04
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多