【问题标题】:Map JPA Embedded entity class id to Embeddable entity class id将 JPA Embedded 实体类 id 映射到 Embeddable 实体类 id
【发布时间】:2018-12-08 11:44:41
【问题描述】:

我有一堂课:

@Entity
public class A {
    @Embedded
    @AttributeOverride(name = "id", column = @Column(name = "b_id"))
    private B b;
}

表A中有b_id BIGINT NOT NULL列

@Embeddable
@Entity
public class B {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

我们收到错误:原因:org.hibernate.MappingException:找不到组件属性:id

基本上,我们需要使用 id 将 B 映射到 A

请帮忙

【问题讨论】:

  • 你在哪一门课上有例外?您来自class B 的专栏实际上命名为id 吗?
  • @DamCx 是的 B 类有列名 id
  • @SergVasylchak ...试过这不起作用
  • 我认为B不应该用@Entity注释,只有@Embeddable

标签: java hibernate spring-data-jpa microservices hibernate-mapping


【解决方案1】:

我认为问题在于嵌入式类中的@Id。我们不能在嵌入式类中使用。试试去掉?如果您可以删除它,如果您只需要一个 id 字段,请尝试使用 @EmbeddedId

【讨论】:

  • 我们需要映射两个实体类,因此@Id 是强制性的。我们无法删除它
  • 我明白你为什么不能删除它。但就是这样!你可以有@Id。
【解决方案2】:

试试这个

    @Entity
    public class A implements Serializable {
    private static final long serialVersionUID = 9154946919235019012L;
    @Embedded
    @AttributeOverride(name = "id", column = @Column(name = "b_id"))
    private B b;
    public A() {
    }

    public A(B b) {
        this.b = b;
    }


    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
    }

这里是B类

@Embeddable
@Entity

public class B implements Serializable {
    private static final long serialVersionUID = 5579181803793008928L;
    @Id
    @Column(nullable = false)
    private Long id;

    public B(Long id) {
        this.id=id;
    }
    public B(){

    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
    }

除了隐式 no arg 之外,您没有 getter 和 setter 或其他构造函数。您应该同时拥有无参数构造函数以及 getter 和 setter 方法。

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2013-08-18
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多