将数据库值重定向到另一个对象的字段
Redirect database value to field of another object
我正在使用 Derby 数据库和 Hibernate 将 table 列拉入 Java class 字段。当为名为 CourseCredits.class
的 class 提取数据时,我得到一个 MappingException。这是因为名称为 Course 的列的类型为 VARCHAR(30)
,对应的 class 字段的类型为 Course.class
:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@Column(name="Course")
private Course course;
public CourseCredit(){
}
// getters and setters
}
如果我将全局变量 course
更改为 String 类型,那么程序将按预期运行:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@Column(name="Course")
private String course;
...
}
鉴于 class Course.class
看起来像这样:
public class Course {
private String name;
...
}
是否可以将课程列中的字符串存储到 Course.class
的 实例 中,特别是全局变量 name
?
更新
根据 Bartosz 的建议,classes 现在看起来像这样:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@OneToOne
@JoinColumn(name = "CourseId")
private Course course;
...
}
@Entity
public class Course implements Serializable{
@Id
@Column(name="CourseId")
private String name;
...
}
我从 Course.class
中创建了一个实体,因为关联映射指定了 实体 之间的关系。不幸的是,错误尚未解决。现在我得到一个错误 ERROR 42X04
。这就是我运行:
em.getTransaction().begin(); // em is the entity manager
List<CourseCredit> credits = this.em.createQuery("from CourseCredit").getResultList();
问题不在于此执行代码,因为如果我使用 String 类型的字段而不是 Course
,程序可以正常运行。我得到的错误输出是:
Caused by: java.sql.SQLSyntaxErrorException: Column 'COURSECRED0_.COURSEID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'COURSECRED0_.COURSEID' is not a column in the target table.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement42.<init>(Unknown Source)
at org.apache.derby.jdbc.Driver42.newEmbedPreparedStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.doPrepare(StatementPreparerImpl.java:146)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
... 19 more
它似乎抱怨一个不存在的列(CourseId
),这是真的。我对数据库一无所知,所以如果是新手问题请见谅,但是 @JoinColumn
中的名称 CourseId
有什么意义?它似乎表示一个新的列名。我看到它在我能找到的每个示例中都使用过,但在定义它之后从未被引用过。
关联用于此。
您需要决定基数(一对一?多对多?)
假设一对一和您需要的情况
@OneToOne
@JoinColumn(name = "course_id")
private Course course;
使用关联时,链接 table(在您的情况下是诅咒)必须存在。您可以手动创建它或从 Hibernate 注释生成数据库模式。
Hibernate 文档包含所有情况的示例。文档包括基础 table 结构。
查看更多详情http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations
我正在使用 Derby 数据库和 Hibernate 将 table 列拉入 Java class 字段。当为名为 CourseCredits.class
的 class 提取数据时,我得到一个 MappingException。这是因为名称为 Course 的列的类型为 VARCHAR(30)
,对应的 class 字段的类型为 Course.class
:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@Column(name="Course")
private Course course;
public CourseCredit(){
}
// getters and setters
}
如果我将全局变量 course
更改为 String 类型,那么程序将按预期运行:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@Column(name="Course")
private String course;
...
}
鉴于 class Course.class
看起来像这样:
public class Course {
private String name;
...
}
是否可以将课程列中的字符串存储到 Course.class
的 实例 中,特别是全局变量 name
?
更新
根据 Bartosz 的建议,classes 现在看起来像这样:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@OneToOne
@JoinColumn(name = "CourseId")
private Course course;
...
}
@Entity
public class Course implements Serializable{
@Id
@Column(name="CourseId")
private String name;
...
}
我从 Course.class
中创建了一个实体,因为关联映射指定了 实体 之间的关系。不幸的是,错误尚未解决。现在我得到一个错误 ERROR 42X04
。这就是我运行:
em.getTransaction().begin(); // em is the entity manager
List<CourseCredit> credits = this.em.createQuery("from CourseCredit").getResultList();
问题不在于此执行代码,因为如果我使用 String 类型的字段而不是 Course
,程序可以正常运行。我得到的错误输出是:
Caused by: java.sql.SQLSyntaxErrorException: Column 'COURSECRED0_.COURSEID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'COURSECRED0_.COURSEID' is not a column in the target table.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement42.<init>(Unknown Source)
at org.apache.derby.jdbc.Driver42.newEmbedPreparedStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.doPrepare(StatementPreparerImpl.java:146)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
... 19 more
它似乎抱怨一个不存在的列(CourseId
),这是真的。我对数据库一无所知,所以如果是新手问题请见谅,但是 @JoinColumn
中的名称 CourseId
有什么意义?它似乎表示一个新的列名。我看到它在我能找到的每个示例中都使用过,但在定义它之后从未被引用过。
关联用于此。
您需要决定基数(一对一?多对多?)
假设一对一和您需要的情况
@OneToOne
@JoinColumn(name = "course_id")
private Course course;
使用关联时,链接 table(在您的情况下是诅咒)必须存在。您可以手动创建它或从 Hibernate 注释生成数据库模式。
Hibernate 文档包含所有情况的示例。文档包括基础 table 结构。
查看更多详情http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations