Метамодель jpa как получить имя таблицы

Сущность:

@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 и стратегию именования, в которой все случаи с верблюдами отделены подчеркиванием.

1 ответ

Решение

Слишком плохо слышать, что (от @Neil Stockton), это не часть метамодели, я думаю, что это действительно должно быть включено.

Во всяком случае, мой код не имеет аннотации, потому что я использую стратегию неявного именования.

Таким образом, это не работает, он получил NullPointerException:

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

Итак, самый простой способ, это повторно использовать мою функцию addUnderscores (измените это на public):

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

Хотя код становится длиннее, но я думаю, что он лучше, чем жестко закодированная строка.

Надеюсь, это поможет другим.

Другие вопросы по тегам