如何让hibernate映射时字段区分大小写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让hibernate映射时字段区分大小写相关的知识,希望对你有一定的参考价值。

如题 例如 属性userName 映射到数据库的时候还是userName而不是username
补充一下:postgreSQL数据库是大小写敏感的!
我要保证数据库中的字段是userName 还要保证以后查询的时候能够查得到
hibernate映射通过hql查询的时候默认全部按小写查询 所以会查找不到对应字段而报错!

CREATE TABLE "RISK"."FE_FIELD_INPUT"  (  
   "ID"                 INTEGER                         NOT NULL,  
   "inputname"               VARCHAR2(100),  
   "inputcode"           VARCHAR2(100),  
   CONSTRAINT PK_FE_FIELD_INPUT PRIMARY KEY ("ID")  
);

注意看,字段名是加了引号的,查看一下创建后的表,在数据库中显示确实是小写的。 
所以会报上面的异常,hibernate会自动将字段名改成大写。

oracle是不区分大小写的,会自动转换成大写。

CREATE TABLE RISK.FE_FIELD_INPUT  (  
   ID                 INTEGER                         NOT NULL,  
   inputname               VARCHAR2(100),  
   inputcode           VARCHAR2(100),  
   CONSTRAINT PK_FE_FIELD_INPUT PRIMARY KEY ("ID")  
);
参考技术A 我好像发现在hibernate映射的字段写成“userName”时(中间的N是大写),映射后的字段名变成了“user_name”。可能是hibernate作了相关的处理。本回答被提问者和网友采纳 参考技术B 数据库字段名不支持区分大小写。无解

如果库支持,你可以试下在hbm.xml配置文件里手动指定列名
<property name="userName" column="userName"/>

Hibernate:复合主键 - 外键:如何在两个表之间映射各个字段

【中文标题】Hibernate:复合主键 - 外键:如何在两个表之间映射各个字段【英文标题】:Hibernate: Composite primary key - foreign key: How individual fields are mapped between two tables 【发布时间】:2018-06-07 12:53:35 【问题描述】:

我试图理解休眠中两个实体之间的 OneToOne 映射,还有一个条件是主键(以及外键)必须是复合的。

UserID 可嵌入类型:

@Embeddable
public class UserID  implements Serializable 

    private static final long serialVersionUID = 1L;
    private int ssnID;
    private int uniqueNum;
    // getters and setters..

VehicleID 可嵌入类型:

@Embeddable
public class VehicleID implements Serializable 
    private int vehicleID;
    private int regNum;
    // getters and setters

具有复合主键 VehicleID 的车辆实体:

@Entity
public class Vehicle 

    @EmbeddedId
    private VehicleID vehicleID;
    private String description;
    // getters and setters..

具有复合主键 UserID 的 UserInfo 实体是 UserInfo 和 Vehicle 之间 OneToOne 关系的拥有方实体:

@Entity
public class UserInfo 
    private String full_name;
    @EmbeddedId
    UserID userID;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumns(@JoinColumn(name="XYZ_ID") , @JoinColumn(name="ABC_Num"))
    Vehicle veh;

    // getters, setters and other code

当我运行这个程序时,下面是 Hibernate 的 SQL 输出:

Hibernate:如果存在则删除表 UserInfo

休眠:如果存在则删除表车辆

Hibernate: 创建表 UserInfo (ssnID integer not null, uniqueNum integer not null, full_name varchar(255), XYZ_ID integer, ABC_Num integer, primary key (ssnID, uniqueNum))

Hibernate: 创建表 Vehicle(regNum integer not null, vehicleID integer not null, description varchar(255), primary key (regNum, vehicleID))

休眠:更改表 UserInfo 添加约束 FKlbuhulsmr2lghirdvem61b9lb 外键(XYZ_ID,ABC_Num)引用车辆

简而言之,UserInfo 是拥有方实体,并且与 Vehicle 实体(具有复合 VehicleID 作为主键)具有 OneToOne 关系。

我的疑惑就在这里:

UserInfo 实体中,我们指定OneToOne 关系(和注释):

@OneToOne(cascade=CascadeType.ALL)
@JoinColumns(@JoinColumn(name="XYZ_ID") , @JoinColumn(name="ABC_Num"))
Vehicle veh;

从上面可以看出,在UserInfo 表中,我们在Vehicle 表上有一个复合外键,JoinColumn 的名称指定为XYZ_IDABC_Num

我的疑问是XYZ_IDABC_Num 对应于Vehicle 表中的哪些字段?

谁能帮我理解这个?

【问题讨论】:

我不明白 XYZ_ID 和 ABC_Num 是什么。在我看来,这应该是 vehicleID 和 regNum。为什么在 JoinColumns 中有这些名字? @SimonMartinelli:是的,应该给他们起合理的名字;但是它们会匹配到另一个表中的哪些字段? Hibernate 也会在 UserInfo 表中创建 vehicleID 和 regNum。只需将 JoinColumns 更改为正确的名称。 是的,它将在 UserInfo 表中创建那些列,但它们将在另一个表中匹配到哪些列(因为它们充当外键)。这是我的疑问。 【参考方案1】:

到Vehical主键(ssnID,uniqueNum)

【讨论】:

是的,这是正确的,但单独来说,它会匹配到哪个字段?例如,如果我用哪一列写 XYZ_ID,它将与 VehicleID 有关系(它有两个字段)。这是我的困惑:( 哦,我明白了。如果您只使用名称,那么它将匹配具有相同名称的列。如果此列具有不同的名称,您还可以定义 referencedColumnName。 谢谢,那么根据引用表中匹配的各个字段进行命名是一种好习惯吗? 是的。我推荐阅读这本书pragprog.com/book/bksqla/sql-antipatterns

以上是关于如何让hibernate映射时字段区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

hibernate配置文件怎么修改才能使表名、字段名区分大小写

如何让mysql的表名/字段名/字段值区分大小写

在使用 SpringBoot 开发的 REST API 中映射到 Java 对象时,使 JSON 有效负载字段不区分大小写

如何让 Dapper 动态不区分大小写?

在使用SpringBoot开发的REST API中映射到Java Object时,使XML有效内容字段不区分大小写

如何查看mysql表名字段是不是区分大小写