2011-11-16 147 views
0

我得到以下异常:如何使用Hibernate创建具有嵌套对象的对象?

Referential integrity constraint violation: "FK779B6FDFD4D56C1: PUBLIC.LOG_TAG FOREIGN KEY(PEOPLE_ID) REFERENCES PUBLIC.TAG(ID)"; 

这里就是我想要做的事:

Set<String> tagList = getTags(); 
Log log = new Log(content, user); 
log.addTags(tagList); 
log.save(); 

我觉得理解错误(试图保存的对象与一个对象的引用那还没有保存),但我已经尝试了保存每个对象的顺序的每个组合,并且没有任何东西似乎正在工作。我正在研究创建博客作为参考的Play Framework教程。这是我的模型类:

@Entity 
public class Log extends Model { 
    @Lob 
    public String content; 

    @ManyToOne 
    public User author; 

    @ManyToMany(cascade=CascadeType.PERSIST) 
    public Set<Tag> tags; 

    public Log(String content, User author) { 
     this.author = author; 
     this.content = content; 
     this.tags = new TreeSet<Tag>(); 
    } 

    public void addTags(Set<String> tags) { 
     for (String tag : tags) { 
      Tag newTag = Tag.findOrCreateByName(tag); //since the DB is empty, this method is simply creating and .save()'ing tags 
      this.tags.add(newTag); 
     } 
    } 
} 

现在,标记类是一个简单的实体,只有一个字段。

我在这里做错了什么?我如何完成这项工作?

+0

你的数据库有些奇怪。该异常表示LOG_TAG表具有TAG.ID的外键(PEOPLE_ID)。无论您需要删除并重新创建表格,还是映射存在问题。 Model的名称为“PEOPLE_ID”的@Id列? – sceaj

回答

2

是否使用H2作为数据库日志,使用DB = FS所以它保存到文件系统?您可以尝试删除您的db目录,以便重新创建。模式看起来与模型不同步,因为您的错误消息引用了PEOPLE_ID,并且您的示例中没有“人员”字段。

+0

谢谢!我觉得有点傻,没有意识到引用人的例外。这是深夜:) – Joel

1

看到了什么错误,你可以打开休眠的SQL querys的输出中,然后看看你是否真正保存标签之前保存