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

Hibernate@EmbeddedId加入

慕容安易
2023-03-14

我有一个hibernate映射问题。我有以下两个DB表(不允许我更改DB):

LOCATIONS {
   ID, -- PK
   NAME
}

LOCATION_GROUPS {
   LOC_ID, -- PK, and FK to LOCATIONS.ID
   GROUP_NAME -- PK
}

我试图为这些DB表创建实体,但不知道如何映射表之间的连接。以下是我的尝试(但它是错误的):

可嵌入类

    @Embeddable
    public class LocationGroupId implements Serializable {

        private static final long serialVersionUID = -6437671620548733621L;
        private Location loc;  
        private String group;   
        
        @Column(name = "LOC_ID")
        public Location getLoc() {
            return loc;
        }
        
        @Column(name = "GROUP_NAME")
        public String getGroup() {
            return group;
        }
        
        // ...
    }   

嵌入使用

    @Entity
    @Table(name = "LOCATION_GROUPS")
    public class LocationGroup {

        private LocationGroupId id;

        @EmbeddedId
        public LocationGroupId getId() {
            return id;
        }
        
        // ...
    }
    @Entity
    @Table(name = "LOCATIONS")
    public class Location {

        private Long id;
        private String name;
        private List<LocationGroup> groups;
        
        @Column(name = "NAME")
        public String getName() {
            return this.name;
        }
        
        @OneToMany(mappedBy = "id.loc")
        public List<LocationGroup> getGroups() {
            return this.groups;
        }
        
        @Id
        @Column(name = "ID")
        @SequenceGenerator(name = "LocationIdGen", sequenceName = "LOCATION_SQ")
        @GeneratedValue(strategy = GenerationType.AUTO, generator = "LocationIdGen")
        public Long getId() {
            return this.id;
        }
        
        // ...
    }

困难在于我想在一个列和embeddedId列的一部分之间建立一个单一的连接。对这个问题有什么想法吗?(我正在使用Hibernate4.0.1)

共有1个答案

路奇
2023-03-14

位置必须映射为@JoinColumn,而不能映射为@Column

@JoinColumn(name = "LOC_ID")
public Location getLoc() {
    return loc;
}

请注意,这不是标准的JPA。为了使它成为标准,你会使用

可嵌入类

@Embeddable
public class LocationGroupId implements Serializable {

    private static final long serialVersionUID = -6437671620548733621 L;
    private Long locationId;
    private String group;

    @Column(name = "LOC_ID")
    public Long getLocationId() {
        return loc;
    }

    @Column(name = "GROUP_NAME")
    public String getGroup() {
        return group;
    }
    // ...
}

使用嵌入式ID

@Entity
@Table(name = "LOCATION_GROUPS")
public class LocationGroup {

    private LocationGroupId id;
    private Location location;

    @EmbeddedId
    public LocationGroupId getId() {
        return id;
    }

    @ManyToOne
    @JoinColumn(name = "LOC_ID")
    @MapsId("locationId")
    private Location getLocation() {
        return location;
    }
    // ...
}

文档中解释了这两个映射。

 类似资料:
  • 问题内容: 我有一个hibernate映射问题。我有以下两个数据库表(不允许更改数据库): 我试图为这些数据库表创建实体,但是我不知道如何映射表之间的连接。这是我的尝试(但这是错误的): 困难在于我想在列和一部分嵌入式Id列之间建立一个OneToMany连接。对这个问题有想法吗?(我正在使用hibernate4.0.1) 问题答案: 必须使用而不是使用来映射位置: 请注意,虽然这不是标准的JPA。

  • 问题内容: 我有一个复合主键的表,其中指的是实体 HolidayPackage 有 许多 到 一个 关系 HolidayPackageVariant 和 HolidayPackage 。 当我尝试在HolidayPackageVariant中进行复杂的PK映射时,出现以下错误: 初始SessionFactory创建失败。org.hibernate.annotations.common.Assert

  • 问题内容: 我有一个简单的Entitly类,(和单独类中的字段)。然后,我使用Spring Data()访问数据库(MySql),使用常规ID,查询可以正常工作,无论是Spring生成的查询还是我自己编写的查询。与我没有设法创建正确的查询。我想做的是选择所有id(发生某些情况的EmbeddedId字段之一),这里有一些代码示例,也许有人会知道如何解决它。 实体类: EmbeddedId类: 和存储

  • 问题内容: 我有一个具有以下结构的MySQL数据库(节选): 另外,还有一个USER表,但这并不重要,有了这些表,您可以了解问题的全貌。 如您所见,某些列具有将在类中变为的属性。 并且由于它们与其他表的关系而具有复合主键,因此我无法更改。由于为Composite ,因此映射的类必须具有一个带有相应类的。 问题是我需要在组合的 “本机” 部分中添加一个,例如:必须具有JPA @GeneratedVa

  • 问题内容: 我在注释和上遇到了问题。在Hibernate中运行代码时,我得到: 引起原因:org.hibernate.PropertyAccessException:无法通过com.test.entities.EmployeeId.serverId的反射设置器设置字段值 但是,让我们从头开始…我有一个实体的复合主键,它由指向其他两个实体(和)的外键组成。为了设计简洁,我在Employee实体中使用