【问题标题】:JPA best practices with @Temporal types@Temporal 类型的 JPA 最佳实践
【发布时间】:2012-11-01 21:03:30
【问题描述】:

众所周知,Java 日期/时间类型是可变的。因此,如果我们想避免副作用,我们应该将它们封装起来。

我正在寻找一种允许我在 JPA 2.0 中使用这些数据类型并同时实现封装目标的方法。

在我的实践中,我经常使用类似这段代码的模式:

// imports are omitted 

@Entity
@Access(AccessType.PROPERTY)
public class MyEntity {
    private Integer id;

    @Access(AccessType.FIELD)
    private Calendar createdAt;

    public MyEntity() {
        createdAt = Calendar.getInstance();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Transient
    public Date getCreatedAt() {
        return createdAt.getTime();
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt.setTime(createdAt);
    }

}

有更好的方法吗?

提前致谢。 祝你有美好的一天。

【问题讨论】:

  • 您是否只是想防止属性的值在 setter 之外被更改?因为 Calendar 也是可变的。我不确定你想在这里实现什么。
  • @Perception 你完全正确。我不希望在外部更改时间属性。
  • 好吧,只是想澄清一下。您使用的方法在这个用例中看起来不错。
  • 你不能创建一个新的 Date 对象并从 getter 中返回它吗?

标签: java jakarta-ee jpa


【解决方案1】:

日期可变是我们所有人都必须忍受的设计怪癖。我们已经学会了忍受它,假装 Date 是不可变的,并且从不操纵它(而且 Sun 还通过在那里打了一些弃用使它变得更容易)。

当您保护代码免受自己和可信赖的同事的侵害时,编写防御性代码是没有好处的。我希望没有人会故意做错事!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多