【问题标题】:Hibernate Annotations, specifying which members of a component to make persistentHibernate Annotations,指定组件的哪些成员要持久化
【发布时间】:2010-10-28 05:09:26
【问题描述】:

我有一个 Price 对象,其中包含两个 MonetaryValue,其中一个 MonetaryValue 包含金额和货币。

如果我配置了 XML 方式的 OR 映射,我可以这样做

    <component name="baseAmount" lazy="false" class="MonetartyValue">
        <property name="amount" column="baseAmount" precision="20" scale="2" not-null="true" />
        <!-- <property name="currency" column="baseCurrency" not-null="true" /> -->
    </component>

    <component name="originalAmount" lazy="false" class="MonetaryValue">
        <property name="amount" column="originalAmount" precision="20" scale="2" not-null="true" />
        <property name="currency" column="originalCurrency" not-null="true" />
    </component>

即选择不保留 baseCurrency 元素(因为它是隐式的并且始终相同)。

是否可以通过注解配置的方式实现这一点?


如果我只是这样做,而忽略了 baseCurrency 属性,无论如何它都会以默认名称持久化。

@Embedded
@AttributeOverrides ( {
    @AttributeOverride(name="amount", column= @Column(name="baseAmount"))
} )
private MonetaryValue baseAmount;

@Embedded
@AttributeOverrides ( { 
    @AttributeOverride(name="amount", column= @Column(name="originalAmount")),
    @AttributeOverride(name="currency", column= @Column(name="originalCurrency"))
} )
private MonetaryValue originalAmount;

MonetaryValue 的属性货币也不可能是瞬态的,因为那样它就永远不会被保存。

那么,是否有可能通过注解来实现上述 XML 映射的功能?


正如 mtpettyp 建议的那样,我想将两个 MonetaryValue 存储在一个表中,只使用三列。正如 Autocracy 在他的评论中所建议的那样,您绝对可以通过继承来解决问题。但话又说回来,您也可以使用自定义 .hbm.xml 映射文件而不是使用注释来解决它。我不确定哪个更正确,但我仍然很好奇是否可以解决这两个问题......

【问题讨论】:

    标签: java hibernate annotations


    【解决方案1】:

    我仍然对您的问题感到困惑,但我会猜测您正在尝试读取 baseCurrency 而不更新它?

    // Use this in the override statement for your first baseCurrency
    @Column(insertable=false,updatable=false)
    

    导致:

    @Embedded
    @AttributeOverrides ( {
            @AttributeOverride(name="amount", column= @Column(name="baseAmount"))
            @AttributeOverride(name="currency", column= @Column(name="baseCurrency", insertable=false,updatable=false))
    } )
    private MonetaryValue baseAmount;
    
    @Embedded
    @AttributeOverrides ( { 
            @AttributeOverride(name="amount", column= @Column(name="originalAmount")),
            @AttributeOverride(name="currency", column= @Column(name="originalCurrency"))
    } )
    private MonetaryValue originalAmount;
    

    不过,如果这不是你的意思,你应该澄清更多。我真的不知道你想在这里做什么。

    【讨论】:

    • 他试图在他的实体中嵌入两个 MonetaryValue 对象,但只保留了三​​列 - baseAmount(来自 baseAmount 字段)和 originalAmount 和 originalCurrency(来自 originalAmount 字段)
    • 好吧,听起来他最好使用多个类和继承。为持久性创建一个类,两个以您希望的方式接口/表示它的类?我还是不太明白实现...
    • mtpettyp 对我的追求是正确的。我只是想从数据库中删除 baseCurrency 信息,因为它是系统范围的默认值和常量。继承是解决这个问题的最好方法吗? “货币价值”和“固定货币货币价值扩展货币价值”?还是反过来?
    • 是的,我会说就是这样做。然后,您可以将其硬编码 / 从一个配置中,并将 / 从数据库中持久化到另一个中,但以相同的方式访问它们。
    • 我也有同样的问题。我总是更喜欢 hbm.xml 文件,但不知何故我必须使用注释。尽管我找不到,但至少没有针对此的休眠特定注释吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2011-05-12
    • 2012-02-16
    • 1970-01-01
    相关资源
    最近更新 更多