【问题标题】:name attribute doesn't seem to work in Fieldname 属性似乎在 Field 中不起作用
【发布时间】:2023-03-04 12:29:01
【问题描述】:

当我尝试使用 JPA(Hibernate 实现)将实体映射到表时,我发现了一些令人困惑的地方

当我在 getter 上使用注解时,一切正常

@Column(name = "main_battery_voltage", precision = 2)
public float getMainBatteryVoltage() {
    return mainBatteryVoltage;
}

但是当我在字段上尝试相同的事情时,会使用字段名和属性

@Column(name = "main_battery_voltage", precision = 2)
private float mainBatteryVoltage;

系统忽略 name 属性,在 DB 中使用列名 mainBatteryVoltage 运行,因此任务失败。

我正在使用 MySQL,这是 persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="SolarPersistenceUnit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.cs.solar.db.entity.User</class>
        <class>com.cs.solar.db.entity.Lamp</class>
        <class>com.cs.solar.db.entity.Project</class>
        <properties>
            <property name="hibernate.dialect"     value="org.hibernate.dialect.MySQL5Dialect"/>
            <!--<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>-->
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/SOLAR"/>
            <property name="hibernate.connection.username" value="root" />
            <property name="hibernate.connection.password" value="admin" />
            <property name="hibernate.connection.autocommit" value="false"/>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.max_fetch_depth" value="3"/>
        </properties>
    </persistence-unit>
     <persistence-unit name="TestSolar" />
</persistence>

虽然现在可以了,但我很好奇是什么导致了这个问题,谢谢

【问题讨论】:

  • 您使用的是哪个 Hibernate 版本?
  • 我使用的是 Hibernate 4.0
  • 去掉name属性,命名应该采用默认值,camelCase到camel_case下划线。此外,请确保已设置字段访问类型。并尝试不要使用浮点数,而是使用例如字符串。

标签: java hibernate jpa


【解决方案1】:

你可以在这里找到一个简短的解释:
Hibernate Annotation Placement Question

重点是:
"Hibernate 使用的访问类型将是字段或属性。EJB3 规范要求您在将要访问的元素类型上声明注释,即 如果使用属性访问则为 getter 方法,如果使用字段访问则为字段。应避免在字段和方法中混合使用 EJB3 注释。Hibernate 会猜测访问类型..."

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2010-12-08
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多