簡體   English   中英

為什么傳遞null持久對象而不初始化具有原始數據類型的null持久對象時,smallint會自動插入0

[英]Why smallint is automatically inserting 0 when passing null persistent object without initialization that has primitve data type

我在Java代碼中使用PostgreSQL Plus Advance Server 9.3和hibernate3。 所以今天當我將對象值存儲到數據庫中時遇到了這個問題。

這是帶有所有setter和getter的主類(但我沒有編寫它們):

public class Job {
    private int id;
    private String name;
    private JobActivation jobActivation;
}

這是第二類:

public class JobActivation {

    private int numChecks;
    private int expiryInMinutes;
    private int checksIntervalInMinutes;
    private boolean isMultiple;
}

而為此的數據庫代碼是:

CREATE TABLE job
(
  id integer,
  name character varying(20),
  checks_expiry integer DEFAULT 0,
  num_checks integer DEFAULT 0,
  checks_interval integer DEFAULT 0,
  is_multiple_activation smallint DEFAULT false
)

休眠配置代碼為:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.test.job">
<class name="Job" table="JOB">
<id name="id" column="id">
<generator class="increment"/>
</id>
<property name="name"/>
 <component name="jobActivation" class="JobActivation">
            <property name="expiryInMinutes" column="CHECKS_EXPIRY"/>
            <property name="numChecks" column="NUM_CHECKS"/>
            <property name="isMultiple" access="field" column="IS_MULTIPLE_ACTIVATION"/>
            <property name="checksIntervalInMinutes" column="CHECKS_INTERVAL"/>
        </component>
</class>   
</hibernate-mapping>

現在的問題是,當我創建Job類的對象並且僅設置Job類的所有變量的所有值時,這意味着JobActivation對象在這種情況下為null並使用休眠方式存儲對象持久性對象,例如:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Job job = new Job();
        job.setName("Job1");
try{
        session.save(job);
        session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
        }

那么正在發生的是...存儲在數據庫中的值是:-

Columns "id"|"name"|"checks_expiry"|"num_checks"|"checks_interval"|"is_multiple_activation"
Values    1   Job1      _                 _            _                0

即使當我從數據庫中刪除默認值= 0時,也會返回相同的結果。 然后,我跟蹤了休眠查詢,其值為-

insert into JOB (name, CHECKS_EXPIRY, NUM_CHECKS, IS_MULTIPLE_ACTIVATION, CHECKS_INTERVAL, id) values (?, ?, ?, ?, ?, ?)|insert into JOB (name, CHECKS_EXPIRY, NUM_CHECKS, IS_MULTIPLE_ACTIVATION, CHECKS_INTERVAL, id) values ('Job1', '', '', '', '', 1)

psql的cmd的描述是:

test=# \d+ job
                                         Table "public.job"
         Column         |         Type          | Modifiers | Storage  | Stats target | Description
------------------------+-----------------------+-----------+----------+--------------+-------------
 id                     | integer               |           | plain    |              |
 name                   | character varying(20) |           | extended |              |
 checks_expiry          | integer               | default 0 | plain    |              |
 num_checks             | integer               | default 0 | plain    |              |
 checks_interval        | integer               | default 0 | plain    |              |
 is_multiple_activation | smallint              |           | plain    |              |
Has OIDs: no

當我只是在數據庫中將smallint數據類型更改為int或boolean時,它就可以正常工作-意味着不插入任何預期的值。 所以我想知道到底是什么問題? 在休眠端或Java代碼端或數據庫端是否有問題,解決方案是什么?

因為在Java中,具有原始類型的所有字段(對象變量)始終具有默認值。 對於boolean它始終為false ,對於數字類型,它被解釋為0 如果要在其中存儲null ,則應將其字段的類型更改為Boolean

private Boolean isMultiple;

UPD :您還應該從create-table-sql代碼中刪除is_multiple_activation表字段的DEFAULT false ,因為這意味着該值默認情況下始終為false ,即默認情況下始終為0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM