当前位置: 首页 > 知识库问答 >
问题:

jpa元模型如何获取表名

龚鸿羽
2023-03-14

实体:

@Entity
public class MyAccount {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String userId;

    private String password;

    private String email;

    public Integer getId() {
        return id;
    }

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

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }   
}
public class HibernateNamingStrategy extends PhysicalNamingStrategyStandardImpl implements Serializable {

    private static final long serialVersionUID = -4772523898875102775L;

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    protected static String addUnderscores(String name) {
        final StringBuilder buf = new StringBuilder(name.replace('.', '_'));
        for (int i = 1; i < buf.length() - 1; i++) {
            if (Character.isLowerCase(buf.charAt(i - 1)) && Character.isUpperCase(buf.charAt(i))
                    && Character.isLowerCase(buf.charAt(i + 1))) {
                buf.insert(i++, '_');
            }
        }

        return buf.toString().toLowerCase();
    }
}

JPA元模型:

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(MyAccount.class)
public abstract class MyAccount_ {

    public static volatile SingularAttribute<MyAccount, String> password;
    public static volatile SingularAttribute<MyAccount, Integer> id;
    public static volatile SingularAttribute<MyAccount, String> userId;
    public static volatile SingularAttribute<MyAccount, String> email;

}

我将做如下的事情:

Join<Employee,MyAccount> project = emp.join("my_account", JoinType.LEFT);

我在myaccount_元模型中没有看到任何自动生成的与表名相关的属性。如何在联接条件中使用元模型表名(我不想使用硬编码字符串)?

PS:我使用的是Spring MVC和命名策略,所有camel大小写都用下划线分隔。

共有1个答案

丰辰沛
2023-03-14

很遗憾听到(来自@尼尔·斯托克顿),它不是元模型的一部分,我认为它真的应该包括在内。

无论如何,我的代码没有注释,因为我使用的是隐式命名策略。

这样做,它就不起作用了,它得到了NullPointerException:

System.out.println("Table_Name: " + MyAccount.class.getAnnotation(Table.class).name());
System.out.println("Table_Name: " + HibernateNamingStrategy.addUnderscores(MyAccount.class.getSimpleName()));

虽然代码变长了,但我认为它比硬编码字符串更好。

希望这对其他人也有帮助。

 类似资料:
  • 问题内容: 本着与CriteriaQuery关联的类型安全的精神,JPA 2.0还具有一个API,用于支持实体的元模型表示。 是否有人知道此API的完整功能实现(生成元模型,而不是手动创建元模型类)?如果有人也知道在Eclipse中进行设置的步骤,那将是非常棒的(我认为这与设置注释处理器一样简单,但你永远不会知道)。 编辑:偶然发现了Hibernate JPA 2元模型生成器。但是问题仍然存在,因

  • 问题内容: 本着与CriteriaQuery关联的类型安全的精神,JPA 2.0还具有一个API,用于支持实体的元模型表示。 是否有人知道此API的完整功能实现(生成元模型,而不是手动创建元模型类)?如果有人也知道在Eclipse中进行设置的步骤,那将是非常棒的(我认为它与设置注释处理器一样简单,但您永远不会知道)。 编辑:偶然发现了HibernateJPA2元模型生成器。但是问题仍然存在,因为我

  • 我在JPA上工作。我的要求是从表中获取列名和数据类型。我有查询来做这件事,但这些是原生查询的。如果我使用这些原生查询,它将支持任何数据库,如Oracle,MySql,....... 现在我正在使用MySql和JPA工作得很好。 下面的查询用于获取表列名 我使用JPA中的createNativeQuery()执行了上面的查询。它将支持所有的数据库。如果没有,我怎么能做到这一点。非常感谢。

  • 以下是我在pom中的相关配置.xml: 提前感谢您的帮助。

  • 问题内容: 我需要动态获取 架构中存在 的 所有表的 META信息,元信息如表,实体,列名等。 我遵循了以下教程 https://vladmihalcea.com/how-to-get-the-entity-mapping-to-database-table- binding-metadata-from-hibernate/ 如以上链接中所述,我创建了一个名为MetadataExtractorIn

  • 问题内容: 我定义了一个(最终)继承自的类。我想获取为此模型定义的所有字段的列表。例如,。基本上,我想检索从该类继承的任何内容。 我以为我可以利用来检索这些,但是它返回的列表不包含任何这些字段。看起来Django已经掌握了该类,并添加了其所有魔术属性并去除了实际定义的内容。那么…我如何获得这些领域?它们可能具有为自己的内部目的检索它们的功能? 问题答案: 由于大多数答案已过时,因此我将尝试在Dja