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

JPA /hibernate-嵌入属性

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

JPA /hibernate-嵌入属性

不支持组件(例如@Embeddable)继承,并且很可能永远不会支持。这样做有充分的理由-
实体标识符在Hibernate支持的所有继承策略中都起着至关重要的作用,而组件没有(映射)标识符。

您有三种选择:

A)将零件编号(及其所有后代)映射为实体。PartNumber可能保持抽象:

@Entity@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name="part_type", discriminatorType=DiscriminatorType.STRING)public abstract class PartNumber {...}@Entity@DiscriminatorValue("Ford")public class FordPartNumber extends PartNumber {...}

B)根据您的示例,似乎所有PartNumber后代的行为仅有所不同(它们没有引入要存储的任何新属性)。如果确实如此,您可以将PartNumber属性加上您自己的鉴别符值(这样就知道要实例化哪个类)作为@Embedded私有属性,并在部件类中将get
/ setPartNumber()访问器编组/取消编组适当的子类。您甚至可以编写自己的Hibernate自定义类型来为您完成此操作(这非常简单)。

C)如果PartNumber后代确实在必须存储的属性方面有所不同,并且由于任何原因将它们映射为实体都是不可接受的,则可以使用marshall/unmarshall将它们字符串化(作为XML或其他适合帐单的字符串)并将其存储。我将XStream用于此确切目的,并且编写了一个简单的Hibernate类型来配合它。您的零件映射看起来像

@Type(type="xmlBean")public PartNumber getPartNumber() {    return partNumber;}public void setPartNumber(PartNumber partNumber) {    this.partNumber = partNumber;}

并且PartNumber后代完全不需要映射。当然,缺点是,在数据库中处理XML有点麻烦,因此对于可能需要报告的内容而言,这可能不是理想的方法。OTOH,我使用它来存储插件设置,这为我节省
映射/数据库维护 的许多 麻烦。



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

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

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