gpt4 book ai didi

java - 为什么在传递空持久对象而不初始化具有原始数据类型时,smallint 会自动插入 0

转载 作者:行者123 更新时间:2023-12-01 12:38:58 25 4
gpt4 key购买 nike

我在 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
)

hibernate配置代码是:

<?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,并使用 hibernate 存储对象持久对象,例如:-

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,也会返回相同的结果。然后我跟踪了 hibernate 查询,其值为-

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时,它工作正常 - 意味着不插入任何预期结果的值。所以我想知道到底是什么问题? hibernate 端、Java 代码端或数据库端是否存在问题?解决方案是什么?

最佳答案

因为在java中所有具有原始类型的字段(对象变量)总是有默认值。对于 boolean 来说,它始终是 false,对于数字类型,它被解释为 0。如果您想在那里存储 null,您应该将其字段的类型更改为 Boolean:

private Boolean isMultiple;

UPD:您还应该从 create-table-sql 代码中删除 is_multiple_activation 表字段的 DEFAULT false,因为这意味着,这默认情况下,值始终为 false,即默认情况下它始终具有 0 值。

关于java - 为什么在传递空持久对象而不初始化具有原始数据类型时,smallint 会自动插入 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com