有 Java 编程相关的问题?

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

UUID列中的java空值

我使用EclipseLink+PostgreSQL

我需要用UUID(不是主键)字段的空值创建实体

这是我的实体,在某些情况下,idUser字段必须为空:

@Entity
@Table(schema = "bd00", name = "t_bd00_messages")
public class TBd00Messages implements Serializable {

@Id
@Column(name = "id")
@Getter @Setter
private UUID id;

@Getter @Setter
private String cdoc;

@Getter @Setter
private String receiver;

@Getter @Setter
private String message;

@Column(name = "status")
@Getter @Setter
private Integer statusCode;

@Temporal(TemporalType.TIMESTAMP)
@Getter @Setter
private Date tstmp;

@Column(name = "d_send")
@Temporal(TemporalType.TIMESTAMP)
@Getter @Setter
private Date dSend;

@Column(name = "id_user")
@Getter @Setter
private UUID idUser;

@Getter @Setter
private String subject;

当我持久化对象时,其中idUser=null-a有一个异常:

Internal Exception: org.postgresql.util.PSQLException: ERROR: column     "id_user" is of type uuid but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 125
Error Code: 0
Call: INSERT INTO bd00.t_bd00_messages (id, CDOC, d_send, id_user, MESSAGE, RECEIVER, status, SUBJECT, TSTMP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [********, *******, 2016-07-21 14:35:40.858, null, ......

共 (2) 个答案

  1. # 1 楼答案

    对于基本映射,EclipseLink只需传入null值并让驱动程序进行转换,这显然不能用于UUID null

    要解决这个问题,您需要告诉EclipseLink如何为驱动程序指定类型,如本文https://stackoverflow.com/a/15084881/496099所示 关键部分是调用

    Field.setSqlType(Types.OTHER);
    Field.setTypeName("uuid");
    Field.setColumnDefinition("UUID");
    

    在映射中使用的字段上

  2. # 2 楼答案

    这将允许您在指定列中插入空值

    @Column(name = "id_user", nullable = true)