在spring-data-jpa架构创建中忽略@Column或@Basic JPA注释

时间:2013-11-20 16:29:31

标签: java spring jpa spring-data spring-data-jpa

我完全被我希望开箱即用的东西搞糊涂了。所以要么我做错了,要么就是误解。

我正在尝试在JPA Entity类中使用getter / setter注释。我坚持在JPA维基上找到的一个例子(s。http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes#Conversion)。该示例如下所示:

    @Entity
    public class Employee {
        ...
        private boolean isActive;
        ...
        @Transient
        public boolean getIsActive() {
            return isActive;
        }
        public void setIsActive(boolean isActive) {
            this.isActive = isActive;
        }
        @Basic
        private String getIsActiveValue() {
            if (isActive) {
                return "T";
            } else {
                return "F";
            }
        }
        private void setIsActiveValue(String isActive) {
            this.isActive = "T".equals(isActive);
        }
    }

我采用了最清晰,最干净的spring-data-jpa示例:http://spring.io/guides/gs/accessing-data-jpa/

我从git中检查出来并将其示例实体类(s。https://github.com/spring-guides/gs-accessing-data-jpa/blob/master/complete/src/main/java/hello/Customer.java)更改为如下所示:

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    private String firstName;
    private String lastName;

    protected Customer() {}

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[id=%d, firstName='%s', lastName='%s']",
                id, firstName, lastName);
    }

    @Transient
    private boolean isActive;

    @Transient
    public boolean getIsActive() {
        return isActive;
    }
    public void setIsActive(boolean isActive) {
        this.isActive = isActive;
    }

    @Column
    private String getIsActiveValue() {
        if (isActive) {
            return "T";
        } else {
            return "F";
        }
    }
    private void setIsActiveValue(String isActive) {
        this.isActive = "T".equals(isActive);
    }

}

现在没有任何变化。不会创建相应的字符串字段。创建数据库表的日志中的行仍然如下所示:

17:11:10.540 [main] DEBUG o.h.tool.hbm2ddl.SchemaUpdate - create table Customer (id bigint generated by default as identity, firstName varchar(255), lastName varchar(255), primary key (id))

我完全不知道这可能是什么原因。我找不到spring-data-jpa不允许在getter上注释的文档。

非常非常感谢任何帮助!

2 个答案:

答案 0 :(得分:7)

我认为你只是混合了注释:你必须注释字段或getter,但不能同时注释两者。一旦您决定注释您的ID字段,您必须注释所有字段(而不是getter),反之亦然:如果您注释了getId()方法,则必须注释所有方法。

答案 1 :(得分:1)

如果你想让它与'@Transient'注释一起工作,你应该像Andrei建议的那样,你可以为isActiveValue添加一个额外的字段,但最重要的是一致注释,否则你会得到不可预测的行为。

当注释字段与属性(getter和setter)时,它会产生影响。

在你的情况下,看起来你想在getter中做一些逻辑,因此注释一个字段可能不会有所需的结果。我并不特别喜欢这个逻辑,但我知道需要注释一个getter。

考虑到上面代码中的逻辑,我只是​​简单地消除了字段上的瞬态,并将带有注释的逻辑放在getter和setter中。

@Entity
@Table(name = "Customer")
public class Customer {

    private static final String IS_ACTIVE = "T";

    private long id;
    private String firstName;
    private String lastName;
    private String isActive = "";

    protected Customer() {}

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

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

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

    @Column(unique = true, nullable = false)
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Column(unique = true, nullable = false)
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Column(unique = true, nullable = false)
    public String getIsActive() {
        return isActive;
    }

    public void setIsActive(String isActive) {
        this.isActive = isActive;
    }

    @Transient
    public boolean isActive() {
        return isActive.equals(IS_ACTIVE);
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[id=%d, firstName='%s', lastName='%s']",
                id, firstName, lastName);
    }
}