2017-07-12 33 views
0

实体: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

表名是**不是**元模型(静态或API)的一部分,所以你正在浪费你的时间看向那个方向。表名仅存在于注释/ XML元数据中,或者通过JPA提供程序自己的内部(非可移植)API –

回答

2

这听起来太糟糕了(来自@Neil Stockton),它不是元模型的一部分,我认为它应该包含在内。

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

因此,通过这样做,它不工作,它得到了NullPointerException异常:

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

所以,最简单的方法,就是要重用我的功能​​(将其更改为public):

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

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

希望这对他人有帮助。