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

复合主键未映射

臧彭亮
2023-03-14
CREATE TABLE `parent_table` (
  `parent_id` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`parent_id`),
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `child_table` (
  `child_id` int NOT NULL AUTO_INCREMENT,
  `parent_id` int NOT NULL,
  PRIMARY KEY (`child_id`,`parent_id`),
  FOREIGN KEY `fk2` (`parent_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
@Setter
@Getter
@Entity
@Table(name = "parent_table")
public class Parent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "parent_id")
    private int parentId;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL,orphanRemoval = true)
    private List<Child> childs=new ArrayList<Child>();
    
    }


@Getter
@Setter
@EqualsAndHashCode
public class ChildPK implements Serializable {
    //default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    @Column(name="parent_id",nullable = false) 
    private int parentId;

    @Column(name="child_id")
    private int childId;
}



@Getter
@Setter
@EqualsAndHashCode
@Entity
@IdClass(ChildPK.class)

@Table(name = "child_table")
public class Child implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="child_id")
    private int childId;
     
      
    @Id
    @TableGenerator(name = "child_id_generator", table = "id_sequence", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "child_id_generator")
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id",insertable = false,updatable = false)
    private Parent parent;
    
    }

class MainClass{
    
    public static void main(String[] args)
    {
    entityManager.persist(parent);//in child_table parent_id storing as 0
    }
    }

在child_tableparent_id列作为外键和复合主键的一部分。

Embedded类内部无法使用标识生成器。所以我在这里使用ID类。为child_id列生成自动增量值。

我无法将parent_table生成parent_id值作为外键值存储在child_table中,它存储为0。

有人能检查一下地图吗?帮帮我……

提前致谢...

共有2个答案

金烨华
2023-03-14
@Setter
@Getter
@Entity
@Table(name = "parent_table")
public class Parent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "parent_id")
    private int parentId;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL,orphanRemoval = true)
    private List<Child> childs=new ArrayList<Child>();
    
    }


@Getter
@Setter
@EqualsAndHashCode
@Embeddable
public class ChildPK implements Serializable {
    //default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    @Column(name="parent_id",nullable = false) 
    private int parentId;

        @TableGenerator(name = "child_id_generator", table = "id_sequence", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "child_id_generator")
    @Column(name="child_id")
    private int childId;
}

@Getter
@Setter
@EqualsAndHashCode
@Entity
 @Table(name = "child_table")
    public class Child implements Serializable {
        private static final long serialVersionUID = 1L;

        @EmbeddableId
        private ChildPK childPk=new ChildPk(); 
   
        @ManyToOne(fetch = FetchType.LAZY)
        @MapsId("parentId")
        @JoinColumn(name = "parent_id",insertable = false,updatable = false)
        private Parent parent;
        
        }

class MainClass{
    
    public static void main(String[] args)
    {
    entityManager.persist(parent);//in child_table parent_id storing as 0
    }
    }
宿洋
2023-03-14

如果子id已经是唯一的,为什么需要父id作为主键的一部分?只需使用:

@Setter
@Getter
@Entity
@Table(name = "parent_table")
public class Parent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "parent_id")
    private int parentId;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL,orphanRemoval = true)
    private List<Child> childs=new ArrayList<Child>();
    
    }


@Getter
@Setter
@EqualsAndHashCode
@Entity
@Table(name = "child_table")
public class Child implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="child_id")
    @TableGenerator(name = "child_id_generator", table = "id_sequence", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "child_id_generator")
    private int childId;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Parent parent;
    
    }
 类似资料:
  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?

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

  • 我有两个表:A和B,都有一个复合主键。表B的PK也是表a主键的外键。 当我试图获取映射表B的类的实例时,我得到了以下异常: org.hibernate.TypeMismatchException 这两个类都位于package:com.cairone.ejemple01.entities 完整的日志输出为: 2016-09-21 12:28:24.505错误8568--[main] O.S.Boot

  • 我有2个表,即user和user_session。

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

  • 我的数据库是: 我们可以在Table2中为Table1中的1设置多行。 我的TABLE1实体是: 我的Table1Id类是: 我的TABLE2实体是: 我的Table2Id类是: 当我尝试启动我的tomcat时,我有以下错误: 我尝试使用引用列,主键连接列和许多其他东西,但是通过在互联网上阅读它,它可以解决数据库建模问题。我认为问题是主键和外键在2个表中具有相同的名称,但我可能是错的......我