Hibernate Annotations,指定组件的哪些成员持久化

时间:2009-05-22 12:50:43

标签: java hibernate annotations

我有一个Price对象,包含两个MonetaryValues,其中一个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映射文件而不是使用注释来解决它。我不确定哪个更正确,但我仍然很好奇是否有可能无法解决...

1 个答案:

答案 0 :(得分:3)

我仍然对你的问题感到困惑,但是我会猜测你是在尝试读取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;

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