我正在尝试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中模型类的方法。
任何人都知道我为什么遇到这个问题?谢谢!
答案 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。