带有getter的Hibernate实体属性,但没有setter:PropertyNotFoundException

时间:2012-11-30 18:23:03

标签: java hibernate coding-style

我想有一个hibernate保存到数据库的实体属性,但是在重建对象时不会尝试设置。

我有这样的课程;

@Entity
class Quote {
    private int itemCost;
    private int quantity;

    public Quote(int itemCost, int quantity) {
        this.itemCost = itemCost;
        this.quantity = quantity;
    }

    public void setItemCost(int itemCost) {
        this.itemCost = itemCost;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getItemCost() {
        return this.itemCost;
    }

    public int getQuantity() {
        return this.quantity;
    }

    // This attribute "totalCost" has a getter only, no setter. 
    // It causes a runtime error (see below). 
    public int getTotalCost() {
        return this.itemCost * this.quantity;
    }
}

我想要以下数据库表;

quotes
itemCost   | quantity    | totalCost
------------------------------------
100        | 7           | 700
10         | 2           | 20
6          | 3           | 18

正如您所看到的,“totalCost”字段可以从getTotalCost()获取,但我不想使用setTotalCost()方法,在我的应用程序中它是没有意义的。

我希望将字段写入非set的数据库的原因是,该值可供共享数据库的其他应用程序(即图形界面)使用。

显然,在运行时我目前收到此错误:

org.hibernate.PropertyNotFoundException: Could not find a setter for property totalCost in class Quote

我可以有一个空的二传手,但这是不洁净的。在我的真实代码中有大约13个“只读”属性,我不希望13个空白的setter混乱我的代码。

这有一个优雅的解决方案吗?

1 个答案:

答案 0 :(得分:3)

请参阅Does Hibernate always need a setter when there is a getter?

关于班级使用

  

@ Entity(access = AccessType.FIELD)并注释您的属性。

  

您可以使用@Transient注释来标记它不应存储在数据库中的字段。您甚至可以使用@Formula注释让Hibernate为您派生字段(它通过使用它发送到数据库的查询中的公式来实现)。