【发布时间】:2015-06-08 20:33:37
【问题描述】:
我的 postgresql 数据库中有一个“客户”表,其中包含一个特定字段:cus_number,其中定义了一个序列。该字段不是主键,已有cus_id字段。
cus_number 的默认值为
nextval('customer_cus_number_seq'::regclass) it's the sequence.
使用 pgadmin 时,当我在此客户表中插入一行,其值为 cus_number 时,它可以正常工作并使用默认值序列。
但是在我的 webap 中,当我坚持一个 new Customer() 时,插入的行在字段 cus_number 中没有任何内容。
这是我的自定义实体定义:
public class Customer implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "pers_id")
private Integer id;
...
@Column(name = "cus_number")
private Integer number;
...
}
还有序列脚本:
CREATE SEQUENCE customer_cus_number_seq
INCREMENT 1
MINVALUE 100
MAXVALUE 9223372036854775807
START 114
CACHE 1;
ALTER TABLE customer_cus_number_seq fizzconsulting 的所有者;
请给我一些建议吗?
谢谢。
【问题讨论】:
-
"当我在这个客户表中插入一行时,它的 cus_number 为空值" - 不,它没有。如果您提供
NULL值,则将存储NULL值。默认子句仅在insert语句的列列表中未提及该列时使用(这与提供NULL值不同) -
是的,你是对的!这解释了为什么在没有 cus_number 的情况下进行插入时会设置默认值(序列)。但是使用 JPA,我如何避免在持久化客户实体时设置空值?
-
您创建了一个序列。
GenerationType.IDENTITY用于不同的目的(用于自动增量列)。您需要在字段private Integer id;@SequenceGenerator(name = "customerIdSequence", sequenceName = "customer_cus_number_seq", allocationSize=1, initialValue=1)上方的行中添加@SequenceGenerator,然后使用@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "customerIdSequence")引用此序列。免责声明:我不使用 PostgreSQL,但它在概念上应该与我过去使用的 Oracle 相同。 -
@a_horse_with_no_name 或提供了明确的
DEFAULT关键字,但似乎很少有应用程序和工具支持:-(
标签: postgresql jpa