java - 持久化实体时的问题

标签 java hibernate orm jpa

@Entity
@Table(name = "jobitems")
@IdClass(JobItemId.class)
public class JobItem implements Serializable {

 @ManyToOne
 @PrimaryKeyJoinColumn(name = "forumId")
 private Forum forum;

 @ManyToOne
 @PrimaryKeyJoinColumn(name = "parsingJobId")
 private ParsingJob parsingJob;

 @Id
 @Column(name = "forumId", insertable = false, updatable = false)
 private int forumId;

 @Id
 @Column(name = "parsingJobId", insertable = false, updatable = false)
 private int parsingJobId;

 private String server;
 private String comments;

 /**
 * @param forum
 * @param parsingJob
 */
 public JobItem(Forum forum, ParsingJob parsingjob) {
 super();
 setForumId(forum.getId());
 setParsingJobId(parsingjob.getId());

 }

当我创建一个实例并将其持久化时,我得到了以下异常。它说参数的索引超出范围,所以我猜它会尝试添加 6 个参数(对于我的 6 个字段)而不是 4 个。我是否遗漏了一些注释?

有什么想法吗?

我在 JBoss 4.2 和 MySql 上运行

错误信息如下

2007-07-19 17:19:15,968 DEBUG [org.hibernate.SQL] insert into jobitems (server, comments, forumId, parsingJobId) values (?, ?, ?, ?)
2007-07-19 17:19:15,968 INFO [org.hibernate.type.IntegerType] could not bind value '1' to parameter: 5; Parameter index out of range (5 > number of parameters, which is 4).
2007-07-19 17:19:15,968 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2007-07-19 17:19:15,968 DEBUG [org.hibernate.jdbc.ConnectionManager] skipping aggressive-release due to flush cycle
2007-07-19 17:19:15,968 DEBUG [org.hibernate.util.JDBCExceptionReporter] could not insert: [com.vico.software.tools.parsing.entities.JobItem] [insert into jobitems (server, comments, forumId, parsingJobId) values (?, ?, ?, ?)]
java.sql.SQLException: Parameter index out of range (5 > number of parameters, which is 4).
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
 at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2740)
 at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2771)
 at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:2722)
 at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setInt(WrappedPreparedStatement.java:117)

最佳答案

您正在使用 JPA 1.0 兼容映射,即具有相同列的关系和冗余 @Column 字段。 @PrimaryKeyJoinColumn 类似于@JoinColumn(..., insertable = false, updatable = false),参见here .其中之一必须是可写的才能正常工作。你映射它的方式都是不可写的。

所以基本上你可以做两件事:

  1. 对关系设置只读
  2. 将只读设置为冗余的@Column字段

...并将其从另一个中移除。

您可以将 @PrimaryKeyJoinColumn 替换为 @JoinColumn,这样就可以了。但是,Hibernate 因在冗余 @Column 字段上存在只读问题而闻名,因此您必须删除 ..., insertable = false, updatable = false) 来自此处的 @Column。这就是导致这个奇怪异常的原因。我确实认为这是一个错误。这会影响所有最新版本的 Hibernate 3.x,包括 4.0。

关于java - 持久化实体时的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3296726/

相关文章:

java - 在 Neo4j 中,默认隔离级别始终是 READ_COMMITTED 还是仅在使用 Java 扩展它时才出现这种情况?

java - Rocks DB 的 Java API 是否支持 API GetUpdatesSince?

java - Hibernate 查询未返回正确的值

python - 为 RethinkDB 测试 ORM

java - 让 eclipse (java) 与 java3d 一起工作

java - 外键约束在一对多上失败

java - 将模型列表转换为json格式

python - django ORM 中的自定义 SQL : Filtering a list based off another filtered list in one query

sql - 正确转义原始 Django SQL 查询中的字符串

java - 在构造函数中使用数组常量时出现编译器错误