2011-05-16 60 views
4

我想玩一个非常简单的类的JPA!框架,并与id列有一些问题。问题与ID列和JPA

我的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中模型类的一个方法。

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

回答

7

嗯,试试它没有id字段。看起来像Playframework自动创建一个Id字段,如果扩展Model类。见here

” ...... 如果你以前使用过JPA,你知道,每一个JPA实体必须提供一个@Id属性在这里,型号超提供了一个自动生成的数字ID,并且在大多数情况下,这是好的。 “ ...”

+1

使用Spring Data JPA并从AbstractPersistable扩展实体时出现同样的问题@kindofwhat:Thx将我指向正确的方向! – Sal 2012-07-24 00:20:47

2

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

只需从自动删除id字段,它应该工作。我不确定数据库中int(11)的定义是否正确,但如果需要,JPA应自动解决此问题。

+1

但在这种情况下,我该如何获得对象ID?它是否也创建了getter和setter,以及这些如何被调用? – networkprofile 2011-05-16 10:01:49

+0

这是一个公共领域,所以你可以调用'auto.id'并检索它。 – 2011-05-16 10:05:08

1

该专栏是否应该类似于以下注释?

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

您遇到的问题与低估您在游戏框架中获得的“自由”有关。

ID(您的原始问题)以及获取者和设置者(您的后续评论)都会自动为您生成。

id字段来自您正在扩展的Model类,当您在模型中创建公共字段时,会自动生成并使用获取者和设置者,然后将其称为model.field。

尽管所有模型都会为它们提供Id,但如果它们要做更复杂或有意义的事情,建议使用您自己的自定义ID。

0

如果您需要添加您自己的ID字段(例如,因为它需要是整数而不是长整数),则可以扩展GenericModel而不是Model。