id列和JPA的问题

时间:2011-05-16 09:31:50

标签: java hibernate jpa playframework

我正在尝试JPA,这是一个非常简单的Play类!框架,我在id列上遇到了一些问题。

我的sql数据库只有两列:

CREATE TABLE IF NOT EXISTS `auto` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

我的模特是:

@Entity
@Table(name = "auto")
public class Auto extends Model{

    @Column(insertable = false, updatable = false)
    public int id;

    public String name;

    public Auto(String name){
        this.name = name;
    }
}

没有这一部分,一切正常:

    @Column(insertable = false, updatable = false)
    public int id;

我添加public int id;后,我会收到此错误:A JPA error occurred (Unable to build EntityManagerFactory): Repeated column in mapping for entity: models.Auto column: id (should be mapped with insert="false" update="false")

这就是我添加了列注释的原因,但它也没有用,现在我得到了:

A javax.persistence.PersistenceException has been caught, org.hibernate.PropertyAccessException: could not set a field value by reflection setter of models.Auto.id

我正在以这种方式测试模型:new Auto("bmw").save(); save()是playframework中模型类的方法。

任何人都知道我为什么遇到这个问题?谢谢!

4 个答案:

答案 0 :(得分:6)

嗯,没有id字段就完全尝试。看起来Playframework会在扩展Model类时自动创建Id字段。见here

” ... 如果您之前使用过JPA,那么您知道每个JPA实体都必须提供@Id属性。这里Model超类提供了一个自动生成的数字ID,在大多数情况下,这已经足够了。 ......“

答案 1 :(得分:1)

class Model已经添加了一个类型为Long的id字段。这与您在类定义中添加的id字段相冲突。

只需从Auto中删除id字段即可。我不确定数据库中int(11)的定义是否正确,但如果需要,JPA应自动解决。

答案 2 :(得分:1)

该列是否应该注释类似于以下内容?

@Id
@GeneratedValue(generator="???_seq",strategy=GenerationType.SEQUENCE)

答案 3 :(得分:0)

如果您需要添加自己的id字段(例如,因为它需要是Integer而不是Long),您可以扩展GenericModel而不是Model。