3

我正在尝试将数据库中的字段更新为整数字段的空值。我正在尝试使用休眠来做到这一点。我可以将对象字段(如 String 和任何其他对象)设置为 null 但不设置整数。

<?xml version="1.0" encoding="UTF-8"?>

<class name="App_Users" table="app_users" schema="bidtool">

    <id name="userId" type="int" column="user_id">           
        <generator class="assigned"/>
    </id>  

    <property name="username" type="string">
        <column name="username" length="20" not-null="true" />
    </property>
    <property name="password" type="string">
        <column name="password" length="20" not-null="true" />
    </property>
    <property name="firstname" type="string">
        <column name="firstname" length="20" />
    </property>
    <property name="lastname" type="string">
        <column name="lastname" length="20" />
    </property>
    <property name="userType" type="int">
        <column name="user_type" />
    </property>

    <many-to-one class="MasterOrg"  fetch="select"  name="masterOrg">
        <column name="master_org_id" />
    </many-to-one>

   <many-to-one class="CarrierScac"  fetch="select" name="carrierScac">
        <column name="scac" />
    </many-to-one>


     <one-to-one class="AppUserDetails" fetch="select" name="details" constrained="true"/>

    <set name="profiles" inverse="true">
        <key>
            <column name="user_id" />
        </key>
        <one-to-many class="Profiles" />
    </set>

    <set name="boilerPlates" inverse="true">
        <key>
            <column name="user_id" />
        </key>
        <one-to-many class="BoilerPlate" />
    </set>


    <set name="rates" inverse="true" >
        <key>
            <column name="user_id" />
        </key>
        <one-to-many class="BidToolRates" />
    </set>


</class>     


在上面的休眠映射代码中,我想将 MasterOrg 字段设置为空。

4

1 回答 1

6

最好将对象包装器用于原始类型,即 Integer 用于 int,Double 用于 double 等,因为原始类型不允许 null 的可能性,而这在数据库设计中总是可能的。

即使一个值在数据库中声明为非空,Object 类型仍然有用。以以下场景为例。

@Entity 
public class ExampleEntity {
    @Column(name="some_column") // assume this column is defined not null in the database 
    private int someProperty; 

    getttes settters other fields go here 

}

假设您编写以下代码

ExampleEntity t = new ExampleEntity();
entityManager.persist(t); 

在此示例中,t.someProperty 的值为 0,因为这是 int 的默认值,因此 entityManager.persist 有效,但可能 0 不是该列的有效值。如果您对该列有数据库约束,那么您会收到错误消息,否则您的数据库中有错误数据。

如果 someProperty 被声明为包装类型为 Integer 并且开发人员忘记设置 somePorpety 值,那么您将得到一个非空异常。

始终使用包装器的第二个原因是作为开发人员的简单性,我希望跨实体的结构保持一致,因为代码被更频繁地阅读,以至于它被普遍地使用实体上的包装器类型编写,这使得事情对于某些人在 5 年后维护代码是可预测的。

于 2012-06-25T19:54:32.287 回答