gpt4 book ai didi

java - 嵌入式 CompositeType 的 Hibernate @AttributeOverride columnNames

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:57 27 4
gpt4 key购买 nike

我有一个 Amount,它通过 CompositeUserType 映射到两个数据库列:

public class Amount  {
private BigDecimal value;
private CurrencyCode currency;
}

在这个 Embeddable 中使用:

@Embeddable
public class AccountBalance {
private Calendar date;

@Type(type = Amount.TYPE_DEF)
@Columns(columns = {
@Column(name = "amount"),
@Column(name = "currencyCode")})
private Amount amount;
}

这里多次嵌入:

public class AccountStatement
@AttributeOverrides(value = {
@AttributeOverride(name = "date", column = @Column(name = "openingBalanceDate") ),
@AttributeOverride(name = "amount.amount", column = @Column(name = "openingBalanceAmount") ),
@AttributeOverride(name = "amount.currencyCode", column = @Column(name = "openingBalanceCurrency") )})
@Embedded
@Basic(optional = true)
private AccountBalance openingBalance;

@AttributeOverrides(value = {
@AttributeOverride(name = "date", column = @Column(name = "closingBalanceDate") ),
@AttributeOverride(name = "amount.amount", column = @Column(name = "closingBalanceAmount") ),
@AttributeOverride(name = "amount.currencyCode", column = @Column(name = "closingBalanceCurrency") )})
@Embedded
@Basic(optional = true)
private AccountBalance closingBalance;

结果是:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: ...AccountStatement column: amount (should be mapped with insert="false" update="false")

当我将 updatable = false, insertable = false 添加到 AccountBalance 的两列中时(如异常文本中所建议的),模式验证成功,但失败关于插入数据,因为它试图将 BigDecimal 插入到 PreparedStatement 中的下一个字段(我的摘录中未显示),这是一个日期。

所以我希望这些值是可插入和可更新的。

由此得出的结论是,hibernate 没有正确处理我对 Amount 两列的 AttributeOverrides 注释。

我已经尝试了多种选择:

  1. amount.amountamount.currencyCode(列名,如摘录中所示)
  2. amount.valueamount.currency(Amount 中的字段名称和 getPropertyNames 返回的值我的 CompositeUserType
  3. 只是 amountcurrencyCode(导致 AnnotationException:AttributeOverride.column() 现在应该覆盖所有列)

Hibernate 似乎不太关心点后面的内容。我可以将其更改为 amount.abcdef,它不会引发错误,所以我现在几乎只是猜测,如何覆盖这些列名称。

Amount 不在 Embeddable 中时,即使在同一个实体中多次使用,它也能很好地处理此声明。

    @Type(type = Amount.TYPE_DEF)
@Columns(columns = {
@Column(name = "amount"),
@Column(name = "currencyCode")})
private Amount amount;

有人有想法吗?我能找到的关于该主题的所有内容仅与 Embeddables 有关,而不是 Embeddables 中的 CompositeUserTypes。

我正在使用 hibernate-5.1.2-final。

最佳答案

我已经向 Hibernate 提交了一个拉取请求,最近合并了,这将允许它工作: https://hibernate.atlassian.net/browse/HHH-11465

此补丁的工作方式,您将需要两次指定相同的覆盖名称,因此在您的示例中它将是:

@AttributeOverrides(value = {
@AttributeOverride(name = "date", column = @Column(name = "openingBalanceDate") ),
@AttributeOverride(name = "amount", column = @Column(name = "openingBalanceAmount") ),
@AttributeOverride(name = "amount", column = @Column(name = "openingBalanceCurrency") )})
@Embedded
@Basic(optional = true)
private AccountBalance openingBalance;

(顺序必须是 CompositeUserType 中的顺序。)

现在已合并,因此它将在 Hibernate 5.2 的下一个版本中发布,即 5.2.11。

关于java - 嵌入式 CompositeType 的 Hibernate @AttributeOverride columnNames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41168878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com