当前位置: 首页 > 面试题库 >

当子有复合PK时,如何在父实体中定义@OneToMany?

萧秋月
2023-03-14
问题内容

我的Parent班级有两个子班级:
ChildParentHobby。Child类具有单个PK,并且其@OneToMany上的映射有效。问题是我不知道如何将其映射到具有复合PK的ParentHobby类。

上级:

//this works
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<Child> childList;

//this DOES NOT work
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<ParentHobby> hobbyList;

儿童:

@Entity
@Table(name="CHILD")
public class Child {


    @Id
    @SequenceGenerator(name="CHILD_SEQ", sequenceName="CHILD_DB_SEQ", allocationSize = 1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CHILD_SEQ")
    @Column(name="CHILD_ID")
    private long childID;

    @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
    @ManyToOne(optional = true)
    private Parent parent;

家长爱好:

@Entity @Table(name =“ PARENT_HOBBY”)公共类ParentHobby {

@EmbeddedId
private ParentHobbyPK id;

ParentHobbyPK:

@Embeddable
public class ParentHobbyPK {

    @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
    @ManyToOne(optional = true)
    private Parent parent;

    @Column(name="HOBBY_ID")
    private String hobbyID;

我在编译时遇到的异常是:

mappedBy reference an unknown target entity property: ParentHobby.parent in Parent.hobbyList

当子有复合主键时,如何在父实体中定义@OneToMany关系?


问题答案:

您需要使用派生身份。

ParentHobbyPK 应该看起来像这样:

@Embeddable
public class ParentHobbyPK {
    @Column(name="HOBBY_ID")
    private String hobbyID;
    private long parentID; // corresponds to the PK type of Parent
}

ParentHobby应该看起来像这样(重要的是@MapsId注释):

@Entity
@Table(name="PARENT_HOBBY")
public class ParentHobby {
    @EmbeddedId
    private ParentHobbyPK id;

    @MapsId("parentID") // maps parentID attribute of the embedded ID
    @ManyToOne(optional = true)
    @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
    private Parent parent;

    ...
}

派生身份将在JPA 2.1规范的第2.4.1节中讨论。



 类似资料:
  • 我的类有两个子类:和。子类有一个单数PK,其上的映射起作用。问题是我不知道如何将它映射到ParentHobby类上,这个类有一个复合PK。 家长: @entity@table(name=“parent_hobby”)公共类ParentHobby{ ParentHobBypk: 我在编译时遇到的例外情况是: 当子实体具有复合主键时,如何在父实体中定义@OneTomany关系? 相似: @OneTom

  • 问题内容: 我正在用bootspring学习。 一直工作到我进入内部课程为止。 现在,我可以保存新条目,但不能通过Date检索它们 我需要更改什么? 和 抛出此异常: 问题答案: 您应该在存储库中包括嵌入式密钥类的名称,而不是Long。试试这个(未测试): 之后 是您的,是可嵌入类的属性。还有一件事:如果仅使用嵌入式密钥的一部分,那么就不会期望只有一个结果…

  • 我想我有两个实体具有双向的和关联: ——有很多-- 我想选择实体,其中所有关联的实体都将设置为 例如,如果我有以下数据: 起源: 孩子: 我想要一个HQL或JPQL查询,它返回1的实体。 知道吗?

  • 我的问题很简单,但找到解决办法却成了一项相当乏味和困难的任务。 我有两个冬眠实体, (或“父”实体)有三个字段, (实体的集合-关系)。 当从的集合中删除时(从对象的集合中删除和通过Dog存储库从数据库中删除),以及更新所有者的地址,然后尝试将更新后的对象保存到数据库中,将引发以下异常: 解决这个问题的一种方法是,在更新集合后,通过使用调用所有者的,获取的新版本,然后更新所有者的地址并将实体保存到

  • 我使用的是Spring数据jpa。将子实体添加到父实体后,我将父实体保存到数据库。我想得到孩子的身份证,但我发现我得到的是空的。 我在getId()方法中添加了@GeneratedValue(Strategy=GenerationType.IDENTITY),但它不起作用。 以下是模型: 父实体已经在数据库中,所以我直接找到它,父存储库entends Jpa列举 这里是我的测试代码: 我得到的输出

  • 问题内容: 可以说我有两个实体 我现在想要的是,当我获取EntityA时,我想添加一个where子句以获取所有modelPercent大于0的EntityB。 我不想使用过滤器,因为此要求仅适用于这种特殊情况。 例如数据: 我需要一种方法,可能是获取EntityA的hql,以便当我说EntityA.getEntityBList()时,它应该仅返回1条记录(一个模型百分比为10(大于零的记录))。