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

@OneToMany和复合主键?

闾丘康安
2023-03-14
问题内容

我正在使用带有注释的Hibernate(在spring),并且我有一个对象,该对象具有有序的多对一关系,该对象的子对象具有复合主键,该子对象的一个​​组成部分是返回到该对象的外键。父对象的ID。

结构看起来像这样:

+=============+                 +================+
| ParentObj   |                 | ObjectChild    |
+-------------+ 1          0..* +----------------+
| id (pk)     |-----------------| parentId       |
| ...         |                 | name           |
+=============+                 | pos            |
                                | ...            |
                                +================+

我尝试了各种注释的组合,但似乎都不起作用。这是我能想到的最接近的:

@Entity
public class ParentObject {
    @Column(nullable=false, updatable=false)
    @Id @GeneratedValue(generator="...")
    private String id;

    @OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL})
    @IndexColumn(name = "pos", base=0)
    private List<ObjectChild> attrs;

    ...
}

@Entity
public class ChildObject {
    @Embeddable
    public static class Pk implements Serializable {
        @Column(nullable=false, updatable=false)
        private String parentId;

        @Column(nullable=false, updatable=false)
        private String name;

        @Column(nullable=false, updatable=false)
        private int pos;

        @Override
        public String toString() {
            return new Formatter().format("%s.%s[%d]", parentId, name, pos).toString();
        }

        ...
    }

    @EmbeddedId
    private Pk pk;

    @ManyToOne
    @JoinColumn(name="parentId")
    private ParentObject parent;

    ...
}

经过长时间的实验后,我得出了这一结论,在该尝试中,我进行的其他大多数尝试都产生了由于各种原因甚至无法加载hibernate状态的实体。

更新:谢谢大家的评论;我已经取得了一些进展。我做了一些调整,我认为它已经接近了(我已经更新了上面的代码)。但是现在,问题在插入中。父对象似乎保存得很好,但是子对象没有保存,我能够确定的是hibernate状态并未填充子对象(复合)主键的parentId部分,所以我我收到一个不唯一的错误:

org.hibernate.NonUniqueObjectException:
   a different object with the same identifier value was already associated 
   with the session: [org.kpruden.ObjectChild#null.attr1[0]]

我在自己的代码中填充nameand pos属性,但是我当然不知道父ID,因为它尚未保存。关于如何说服hibernate状态来解决这个问题的任何想法?

谢谢!


问题答案:

经过大量的试验和挫折,我最终确定我无法完全做到自己想要的。

最终,我继续给孩子对象提供了自己的综合密钥,然后让Hibernate对其进行管理。这不是一个理想的方法,因为密钥几乎和其余数据一样大,但是可以使用。



 类似资料:
  • 我有两个实体的订单和项目。在Order entity中,id是OrderId、UserId的复合主键,但在Items中,外键仅为Order id。 如何使用订单Id获取项目列表 我尝试使用mappedBy,如上所述,无论在哪种情况下,我都得到了错误。 任何帮助都是非常感谢的。

  • 我正在使用JPA(Hibernate)并试图用childs和复合键持久化整个新实体,但当持久化childs时,我在键中得到了null。表结构: 映射:

  • 我在将OneToMany外键映射到复合主键时遇到问题。我已经尝试过很多解决方案,包括这个post@onetomany和复合主键?。 所以情况是: 因此,在Box实体中,我试图在Box和Color实体之间创建一个OneToMany映射。为此,我应该使用Color实体的复合主键吗?如果我试图将列连接到复合主键(就像我在Box实体中所做的那样),我确实会得到一个错误-无法定位逻辑列“locale”。 我

  • 问题内容: 我正在设计一个数据库,该数据库将用于存储来自许多不同来源的数据。我存储的实例由原始来源分配了唯一的ID。我存储的每个实例都应包含有关其来源的信息,以及与此来源相关联的ID。 作为示例,请考虑说明该问题的下表: 请注意,尽管每个来源的唯一,但有可能在不同来源中找到相同的来源。 我对关系数据库有一个不错的了解,但是与专家甚至是经验丰富的用户都相去甚远。我在此设计中面临的问题是应该用作主键。

  • 问题内容: 我的JPA模型中有以下类(省略了getters,setters和无关字段): 我需要定义一个类,使得当从所述类生成DDL时,相应的表的主键被由密钥和。我尝试了以下方法: 但这会为表生成以下内容: 请注意,和都是可为空的,当我尝试将DDL加载到SQL Server时会导致以下错误 无法在表“ PRICE”中的可为空的列上定义PRIMARY KEY约束 我不明白为什么这些可以为空,因为在域

  • 我在使用复合主键的hibernate实体集时遇到了问题。 我们的应用程序中有一个概念“Target”。目标id应该是其他三个表(实体)主id的组合。目标也有一个int标记。员工应该有一系列目标。SQL如下所示: 这个SQL工作正常,它允许我每个role_id(员工)多个目标,只要应用程序和项目分类不同。 这是目标ID类 这是目标类 这是employee类,我想在其中为每个员工存储一组目标。 通过h