【问题标题】:Problem: Java.util.date does not allow duplicate date value in hibernate问题:Java.util.date 不允许休眠中的重复日期值
【发布时间】:2020-09-02 05:39:48
【问题描述】:

我尝试创建一个包含一些信息的表,例如 iddatestaffprovider 以执行 CRUD。当我使用 java.util.date 和 @Jsonformat 添加日期时,它不允许我插入重复值。
例如,当我插入日期“25-01-1996”时,我无法再次插入该日期。
它说:“错误:重复键值违反唯一约束详细信息:键(日期)=(2107-01-25 07:00:00)已经存在”。
然后,我用 java.util.date 尝试了很多方法,比如自定义序列化器或反序列化器,但还没有奏效。
这是我的模型:

        @Id
        @Column(name="id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;

        @Column(name="date", nullable = false, unique = false)
        //@JsonSerialize(using = DateSerializer.class)
        //@JsonDeserialize(using = DateDeserializer.class)
        //@Temporal(TemporalType.DATE)
        @JsonFormat(pattern = "dd-MM-yyyy", shape = JsonFormat.Shape.STRING)
        @GeneratedValue
        private Date date;

        @ManyToOne
        @JoinColumn(name="staff_id")
        private Staff staff;

        @ManyToOne
        @JoinColumn(name="provider_id")
        private Provider provider;

这里是序列化器和反序列化器:

    {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException,
            JsonProcessingException {
                String DateSerializer = dateFormat.format(date);
                jsonGenerator.writeString(DateSerializer);
    }
}
    {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");

    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException {
        if (jsonParser.getCurrentToken().equals(JsonToken.VALUE_STRING)){
            try {
                Date date = dateFormat.parse(jsonParser.getText().toString());
                return date;
            } catch (ParseException e) {

            }
        }
        return null;
    }
}

我尝试过的另一个版本:

    private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
        @Override
        protected SimpleDateFormat initialValue()
        {
            return new SimpleDateFormat("ddMMyyyy");
        }
    };

    public String formatIt(Date date)
    {
        return formatter.get().format(date);
    }

谢谢!

【问题讨论】:

  • 确保在数据库中date 也没有被标记为唯一索引
  • @Vishnu 谢谢!我查看了我的数据库,但似乎没有任何唯一数据

标签: java hibernate spring-mvc mapping java.util.date


【解决方案1】:
  1. 不应将@GeneratedValue 注释用于不是entity identifier 的字段(由@Id 注释注释)。

  2. 您应该使用@Temporal 注释和java.util.Date 来指定TemporalType

因此,您应该通过以下方式更正您的模型:

@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name="date", nullable = false, unique = false)
@Temporal(TemporalType.DATE)
@JsonFormat(pattern = "dd-MM-yyyy", shape = JsonFormat.Shape.STRING)
private Date date;

@ManyToOne
@JoinColumn(name="staff_id")
private Staff staff;

@ManyToOne
@JoinColumn(name="provider_id")
private Provider provider;

【讨论】:

  • 请用您的异常的完整堆栈更新您的问题。
  • 我尝试了很多方法来自定义我的日期序列化器,现在它工作了!顺便说一句,非常感谢我的朋友!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多