当前位置: 首页 > 知识库问答 >
问题:

Hibernate复合外键共享列

屠君墨
2023-03-14
@Embeddable
public class ID implements Serializable {
    private Long autoin;      // Surrogate key
    private Integer serverId; // instance identifier

    @Column(name = "autoin_fix")
    public Long getAutoin() {
        return this.autoin;
    }
    @Column(name = "servdat_fk")
    public Integer getServerId() {
        return this.serverId;
    }

    // ... setter, equals, hashCode ...
}
@Entity
@Table(name = "LEADS")
public class Request {
    private Long id;

    private Article article;
    private Location location;

    @Id
    @Column(name = "autoin_fix")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "auto-increment")
    @GenericGenerator(name = "auto-increment", strategy = "sequence",
            parameters = @org.hibernate.annotations.Parameter(name = "sequence", value = "AUTOINCREMENT"))
    public Long getId() {
        return this.id;
    }

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "artikel_fk", referencedColumnName = "autoin_fix", 
                    insertable = false, updatable = false), // Here is the problem!
        @JoinColumn(name = "servdat_fk", referencedColumnName = "servdat_fk", 
                    insertable = false, updatable = false)
    })
    public Article getArticle() {
        return this.article;
    }

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "standort_fk", referencedColumnName = "autoin_fix"),
        @JoinColumn(name = "servdat_fk", referencedColumnName = "servdat_fk")
    })
    public Location getLocation() {
        return this.location;
    }

    // Setters omitted
}
TABLE leads
-------------
autoin_fix
artikel_fk
standort_fk
servdat_fk  // This only exists once, but is part of the association to both Article and Location!
// This is illegal and the application won't start
@JoinColumns({
        @JoinColumn(name = "artikel_fk", referencedColumnName = "autoin_fix"),
        @JoinColumn(name = "servdat_fk", referencedColumnName = "servdat_fk", insertable = false, updatable = false)
    })

有人知道解决这个问题的办法吗?或者这是不可能使用Hibernate/JPA进行映射的吗?

Edit:Article和Location的(简化)定义(真的没那么有趣,重要的是它们使用了复合主键):

@Entity
@Table(name = "ARTIKEL")
public class Article {
    private ID id;
    private String headline;
    private String description;

    @EmbeddedId
    public ID getId() {
        return this.id;
    }

    @Column(name = "artbesch")
    public String getDescription() {
        return this.description;
    }

    @Column(name = "artueschr")
    public String getHeadline() {
        return this.headline;
    }

    // Setters omitted
}

@Entity
@Table(name = "STANDORT")
public class Location {
    private ID id;
    private GeoCoordinates geoCoordinates;
    private Name name;

    @EmbeddedId
    public ID getId() {
        return this.id;
    }

    @Embedded
    public GeoCoordinates getGeoCoordinates() {
        return this.geoCoordinates;
    }

    @Embedded
    public Name getName() {
        return this.name;
    }

    // Setters omitted
}

共有1个答案

段良弼
2023-03-14

我认为,如果依赖实体的派生标识符是嵌入式id类的形式,那么表示关系的id类的每个属性都应该由对应关系属性上的@Mapsid注释引用。

例如:

@Entity
public class Request {
    // ...
    @Id
    int id;

    @MapsId
    @ManyToOne
    private Article article;
    // ...
}

我希望这能奏效,因为我现在不能尝试。

 类似资料:
  • 问题内容: 我有一个类似的问题,如下所示,但解决方案无法解决我的问题。 休眠复合主键包含复合外键,如何映射 我正在尝试加入2个表,每个表都有一个带有部分外键引用的复合主键。 在一个: 在BPK中: 上面的方法给我这个异常: 你能帮忙吗? 问题答案: 假设f1和F2唯一标识A并存在于APK中,则可以通过几种方式使用JPA 2.0的派生ID。最容易显示的是: 这里的关键点是B对A的引用控制了外键字段f

  • 问题内容: 我有一个类似的问题,如下所示,但解决方案无法解决我的问题。 休眠复合主键包含复合外键,如何映射 我正在尝试加入2个表,每个表都有一个带有部分外键引用的复合主键。 在一个: 在BPK中: 上面的方法给我这个异常: 你能帮忙吗? 问题答案: 假设f1和F2唯一标识A并存在于APK中,则可以通过几种方式使用JPA 2.0的派生ID。最容易显示的是: 这里的关键点是B对A的引用控制了外键字段f

  • 我有一个类似的问题如下,但解决方案没有解决我的问题。 hibernate复合主键包含复合外键,如何映射此 我试图连接2个表,每个表都有一个复合主键和部分外键引用。 你能帮忙吗?

  • 问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身

  • 问题内容: 我在这里搜索,但未找到任何类似的主题,因此我发布了一个新问题。 我正在使用现有数据库上的Hibernate。我们不允许更改表的结构和数据。该应用程序正在从数据库读取数据,并根据某种逻辑迁移到另一个数据存储。 现在的问题是关于复合PK映射。例如 表A具有复合PK。 表B也有一个复合PK,此复合PK的一部分是A的PK,此处也用作FK。 我尝试了几种方法,但都无济于事。谁能告诉一个有效的Hi

  • 我遇到了一个问题,我不知道是否可以通过使用Hibernate/JPA注释来解决这个问题。问题是,我有一个复合键,它的列与我的foreignkey复合id中的一个相同,我希望在表中共享这个相同的列。例如: 问题是我如何在A和B之间共享idShared列,并在@manytoone中使用它作为外键? 我已经尝试在名为idShared的@JoinColumns中使用@JoinColumns,但我得到一个错