有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java hibernate在非主键字段上自动生成序列

我在使用hibernate 5.5+postgresql 13

我想要自动生成序列字段(数据库端的自动生成,而不是java端的自动生成),这相当于postgres中的DDL:

CREATE TABLE map_objects (
        oid BIGSERIAL NOT NULL, 
        vid BIGSERIAL NOT NULL, 
        msg VARCHAR, 
        PRIMARY KEY (vid)
);

正如您在DDL中所看到的,在db端vidoid都是自动生成的,但是vidpk,而oid不是

在psql中运行这个普通的DDL sql之后,我得到了1个表和2个序列,这2个序列用于为vidoid生成默认值

                                  Table "public.map_objects"
 Column |       Type        | Collation | Nullable |                 Default                  
--------+-------------------+-----------+----------+------------------------------------------
 oid    | bigint            |           | not null | nextval('map_objects_oid_seq'::regclass)
 vid    | bigint            |           | not null | nextval('map_objects_vid_seq'::regclass)
 msg    | character varying |           |          | 

我希望在hibernate实体声明中有一个等效的定义,下面是我尝试的:

@Entity
public class MapObject {
    @Id
    @Generated(GenerationTime.INSERT)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long vid;

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Generated(GenerationTime.INSERT)
    private Long oid;

    private String msg;

}

vid是好的,但是oid没有按照我预期的方式工作,它为oid插入了null值,甚至在java端没有自动生成值

try2:GenerateType.SEQUENCE,但没有运气

try3:

    @Column(name = "oid", columnDefinition = "BIGSERIAL", nullable = true)
    private Long oid;

这种方法基本上是手动定义列,ORM对实体一无所知,因此在我插入对象后,hibernate不会填充从db生成的oid,它在Java端仍然为空,因此这仍然不是我预期的行为


共 (0) 个答案