gpt4 book ai didi

java - PersistenceException,列 'id' 指定两次

转载 作者:行者123 更新时间:2023-12-01 08:02:19 26 4
gpt4 key购买 nike

我在 Play Framework 2.2.3 中有以下文件

Controller :

public class Comment extends Controller
{
public Result create(UUID id)
{
models.blog.Blog blog = models.blog.Blog.finder.byId(id);

Result result;

if(blog == null)
{
result = notFound(main.render("404", error404.render()));
}
else
{
Form<models.blog.Comment> commentForm = Form.form(models.blog.Comment.class);
commentForm = commentForm.bindFromRequest();

if(commentForm.hasErrors())
{
result = badRequest(Json.toJson(commentForm));
}
else
{
models.blog.Comment comment = commentForm.get();

comment.setId(UUID.randomUUID());
comment.setTimeCreated(new Date());
comment.setBlogId(blog.getId());

comment.save();

result = ok(Json.toJson(comment));
}
}

return result;
}
}

还有两个模型

@Entity
@Table(name="blog")
public class Blog extends Model
{
private static final SimpleDateFormat MONTH_LITERAL = new SimpleDateFormat("MMMMM"),
DAY_NUMBER = new SimpleDateFormat("d"),
YEAR_NUMBER = new SimpleDateFormat("yyyy");
public static Finder<UUID, Blog> finder = new Finder<UUID, Blog>(UUID.class, Blog.class);

@Id
@Column(name="id",length=36, nullable=false)
public UUID id;

@OneToOne
@JoinColumn(name="author_id")
public User author;

@Column(name="title",length=255)
public String title;

@Column(name="summary",length=255)
public String summary;

@Column(name="url",length=255)
public String url;

@Column(name="content")
public String content;

@Column(name="time_updated")
public Date time_created;

@Column(name="time_created", nullable=false)
public Date time_updated;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="blog_id")
public List<Comment> comments;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name="blog_tag_map",
joinColumns={ @JoinColumn(name="blog_id", referencedColumnName="id") },
inverseJoinColumns={ @JoinColumn(name="tag_id", referencedColumnName="id") }
)
public List<Tag> tags;

public List<Comment> getComments()
{
return this.comments;
}
}

@Entity
@Table(name="blog_comment")
public class Comment extends Model
{
private static final SimpleDateFormat MONTH_LITERAL = new SimpleDateFormat("MMMMM"),
DAY_NUMBER = new SimpleDateFormat("d"),
YEAR_NUMBER = new SimpleDateFormat("yyyy");

@Id
@Column(name="id",length=36, nullable=false)
public UUID id;

@Column(name="blog_id", length=36)
public UUID blog_id;

@ManyToOne
public Blog blog;

@Column(name="content", length=500)
public String content;

@Column(name="website", length=255)
public String website;

@Column(name="name", length=255)
public String name;

@Column(name="time_created", updatable=false)
public Date time_created;
}

为了简洁起见,我从这些模型中排除了一些 setter 和 getter,因此它不会阻塞这篇文章。

当我尝试向上述 Controller 发出 POST 请求时,一切正常,直到我到达 Controller 文件中的“comment.save()”语句,然后出现以下错误。

enter image description here

我不确定为什么此保存未完成,以及为什么存在列冲突。非常感谢帮助

最佳答案

问题在于您在评论实体中为博客定义了两个外键列:

@Column(name = "blog_id", length = 36)
public UUID blog_id;

@ManyToOne
public Blog blog;

“博客”字段的默认列名称是:blog_id但是,您已经将“blog_id”列命名为该列。有趣的是,创建此表时不会引发错误/警告...

因此,当调用 comment.save() 时,会生成以下插入语句:

insert into blog_comment (id, blog_id, content, website, name, time_created, blog_id) values (?,?,?,?,?,?,?)

请注意对“blog_id”列的引用两次,这是无效的。这是因为上面的双重映射。

要解决此问题,只需为您的“博客”属性指定一个用于外键列的不同名称即可:

@Column(name = "blog_id", length = 36)
public UUID blog_id;

@ManyToOne
@JoinColumn(name = "blogId")
public Blog blog;

我不确定为什么你要像这样映射你的实体(也许是旧模式?),但“blog_id”字段似乎是多余的(并且令人困惑),因为你已经有了“”形式的实体映射博客的属性。

关于java - PersistenceException,列 'id' 指定两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24377478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com