栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在JPA中映射复合主键,其中主键的一部分是外键

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在JPA中映射复合主键,其中主键的一部分是外键

嗯,您遇到的基本问题是根据列而不是实体进行思考,尽管由于问题有点棘手,所以这可能是不公平的陈述。基本问题是如何将实体作为复合键的一部分包含在内,我在这里找到了答案:如何在JPA中创建包含@ManyToOne属性作为@EmbeddedId的复合主键?。设备:

@Entity@Table(name = "devices")public class Device{    @Id    @Column(name = "device_nbr")    private Long number;    @Column(name = "device_id", length = 20)    private String deviceId;    @ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)    @JoinColumns({@JoinColumn(name="dev_type", referencedColumnName="dev_type"), @JoinColumn(name="model_nbr", referencedColumnName="model_nbr")})    private DeviceModel deviceModel;    // This creates a foreign key constraint, but otherwise doesn't function    // deviceType must be accessed through deviceModel    // note, it can be used for explicit selects, e.g., "select d.deviceType from Device d"    @oneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)    @JoinColumn(name="dev_type", referencedColumnName="dev_type", insertable=false, updatable=false)    private DeviceType deviceType;    @Column(name = "unit_addr", length = 32)    private String unitAddress;

设备型号:

@Entity@Table(name = "devmodels")public class DeviceModel{    @EmbeddedId    private DeviceModelId id;    @ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)    @JoinColumn(name="dev_type")    @MapsId("deviceType")    private DeviceType deviceType;    @Column(name = "model_desc", length=20)    private String  description;

DeviceModelId:

@Embeddablepublic class DeviceModelId implements Serializable{    private static final long   serialVersionUID    = -8173857210615808268L;    private Integer deviceType;    @Column(name="model_nbr")    private Integer modelNumber;

请注意,我使用

@Embeddable
@EmbeddedId
。它只是更新的,我已经阅读了JPA提供程序的评论,它比首选
@IdClass
。我认为这也使列命名更容易一些,但我不记得了。

设备类型:

@Entity@Table(name = "devtypes")public class DeviceType{    @Id    @GeneratedValue    @Column(name = "dev_type")    private Integer deviceType;    @Column(name = "dev_desc", length = 16)    private String  description;

诀窍是

@MapsId
DeviceModel
。这样就可以在CompositeKey中使用实体。该字段上的@JoinColumn启用了该字段的命名。使用它的唯一技巧是手动创建DeviceTypeId:

DeviceModel model = new DeviceModel();DeviceModelId modelId = new DeviceModelId();modelId.setModelNumber(654321);// have to have a DeviceType to create a DeviceModelmodel.setDeviceType(type);model.setId(modelId);

这将创建以下模式,该模式似乎与您的模式匹配。

create table devices (device_nbr bigint not null, device_id varchar(20), unit_addr varchar(32), dev_type integer, model_nbr integer, primary key (device_nbr))create table devmodels (dev_type integer not null, model_nbr integer not null, model_desc varchar(20), primary key (dev_type, model_nbr))create table devtypes (dev_type integer not null, dev_desc varchar(16), primary key (dev_type))alter table devices add constraint FK8q0a886v04gg0qv261x1b2qrf foreign key (dev_type, model_nbr) references devmodelsalter table devices add constraint FKb72a7hq5phwjtbhaglobdkgji foreign key (dev_type) references devtypesalter table devmodels add constraint FK4xlwyd2gwpbs4g4hdckyb11oj foreign key (dev_type) references devtypes


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399407.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号