【问题标题】:Is it possible to persist a DSL Java object with JPA?是否可以使用 JPA 持久化 DSL Java 对象?
【发布时间】:2010-10-27 06:46:56
【问题描述】:

我有一个 DSL Java 对象,即一个 POJO,它在 setter 中返回 this 加上 getter/setter 有一个不寻常的命名模式:

public class Demo {
    private long id;
    private String name;
    private Date created;

    public Demo id (long value) { id = value; return this; }
    public String id () { return id; }
    public Demo name (String value) { name = value; return this; }
    public String name () { return name; }
    public Demo created (Date value) { created = value; return this; }
    public Date created () { 
        if (created == null) created = new Date ();

        return created;
    }

}

是否可以告诉 JPA 使用“name(String)”和“name()”作为 setter/getter 方法?

[编辑] 我的问题是上面的 created 字段。对于该字段,我希望 JPA 使用“getter”created(),因此该字段将始终为非 NULL。

或者有没有办法告诉 JPA 在使用 created == null 创建新对象时使用 CURRENT TIMESTAMP

【问题讨论】:

    标签: java jpa dsl


    【解决方案1】:

    根据 JPA 规范(参见 JSR-220)第 2.1.1 章,您可以通过注释映射信息的字段而不是 getter 方法来告诉 JPA 使用字段访问而不是属性访问。

    我认为您不能告诉 JPA 为 getter 和 setter 使用哪种命名约定,因为它是一个基本的 java beans 概念。

    【讨论】:

    • 哦,忘了说你必须使用注释。不知道它是否适用于 xml 映射。 :-/
    • 如果我不想使用属性访问权限?
    • 这就是我提到的。将注释放在字段之前。现在,在您编辑帖子后,问题仍然存在,“已创建”可能为空。我认为您可以使用 @Column 注释的属性“columDefinition”来定义该列的默认值(参见上述规范的第 9.1.5 章)。
    【解决方案2】:

    当你在类中定义时,你能不能简单地初始化created,然后使用字段访问。

    private Date created = new Date();
    

    【讨论】:

    • 因为在我的情况下, new Date() 是一项昂贵的操作:) 我真的很想懒惰地这样做。
    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2011-01-19
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2012-01-17
    相关资源
    最近更新 更多