【问题标题】:How to set @Column name dynamically in Hibernate如何在 Hibernate 中动态设置 @Column 名称
【发布时间】:2023-03-16 09:31:01
【问题描述】:

我正在尝试在类中动态设置列名(如下所示),但在 @Column 中,它需要常量值作为名称。

public class Common
 {
  final String pre_col_name_created;

  public Common( String pre_col_name )
    {
    this.pre_col_name_created = pre_col_name;
    }

  @Column( name = pre_col_name_created + "" )
  private String created;
}

上面的代码给我错误:

请建议我从@Column 中的其他类动态地赋予pre_col_name_created 值。

我已经参考了以下链接:1,2,3,4,5,6,7,8,9,@98765431 987654332 @,121314151617181920212223

我的目标是:我正在创建 10 个表,所有表都包含 created 列,但前缀具有根据数据模型类设置的不同值。

例如: 表abcqweabcid,a_column(varchar) 和 表qweidq_column(varchar)

使用@Transient我得到了错误:

【问题讨论】:

  • 我认为不可能这样做,但是,您可以使用一些 VO 类(如子类),然后将其映射到您需要的实体,只是一个提示
  • 动态表的目标是什么?
  • 看起来像XY problem。你到底想解决什么问题?
  • @Stefan 请参考编辑问题。
  • 注释中的变量必须是常量。不能有具有不同注释值的类的实例。如前所述,使用子类并覆盖属性

标签: java hibernate jpa data-modeling


【解决方案1】:

下面的代码是你的解决方案:

Test.java

@Entity
@Filter(
    name = "tenancyFilter",
    condition = "et_created = :created"
)
@AttributeOverride(
    name = "created",
    column = @Column(
        name = "et_created"
    )
)
public class Test extends Common
{
    @Id
    @Column( name = "comp_id" )
    private UUID id;

    public UUID getId()
    {
        return id;
    }

    public void setId( UUID id )
    {
        this.id = id;
    }
}

Common.java

@MappedSuperclass
@EntityListeners( { AuditingEntityListener.class})
@FilterDef(
    name = "tenancyFilter",
    parameters = {@ParamDef(
        name = "created",
        type = "timestamp"
    )}
)
public class Common
{

    private Timestamp created;

    public Timestamp getCreated()
    {
        return created;
    }

    public void setCreated( Timestamp created )
    {
        this.created = created;
    }
}

在上面的代码中有 Test 类,您可以将其用作要更改列名称的类,而在 Common 类中,您可以定义所需的通用列的类型。

以下是数据库截图:

我在等你的评论。谢谢

【讨论】:

  • 感谢 Ankit,但出现错误:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: An entity cannot be annotated with both @Entity and @MappedSuperclass: com.postgresspringbootgradle.postgresspringbootgradle.entity.Test
  • @AKAggarwal 请从测试类中删除@MappedSuperclass。因为@MappedSuperclass@Entity 不能一起工作。
  • 感谢您的帮助。
  • @AKAggarwal 欢迎您。
【解决方案2】:

您不能,在初始化应用程序启动中的数据源 bean 时,将评估休眠映射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多