Java Hibernate-OneToMany单向映射-SQLGrammarException
我对冬眠学习还不熟悉,所以研究冬眠中使用的关系。我所理解的是-对于带有外键的OneToMany单向关系映射,连接列将位于目标实体中(在我的例子中是-Review类)。我不需要让它双向运行 但在实施过程中,我发现了以下错误:Java Hibernate-OneToMany单向映射-SQLGrammarException,java,sql,oracle,hibernate,Java,Sql,Oracle,Hibernate,我对冬眠学习还不熟悉,所以研究冬眠中使用的关系。我所理解的是-对于带有外键的OneToMany单向关系映射,连接列将位于目标实体中(在我的例子中是-Review类)。我不需要让它双向运行 但在实施过程中,我发现了以下错误: Hibernate: insert into course (title, id) values (?, ?) Hibernate: insert into review (comment, id) values (?, ?) 2020-05-07 19:44:24 WARN
Hibernate: insert into course (title, id) values (?, ?)
Hibernate: insert into review (comment, id) values (?, ?)
2020-05-07 19:44:24 WARN SqlExceptionHelper:137 - SQL Error: 928, SQLState: 42000
2020-05-07 19:44:24 ERROR SqlExceptionHelper:142 - ORA-00928: missing SELECT keyword
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1356)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:443)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3202)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2370)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
at com.practice.hibernate008.onetomany.unidirectional.HibernateApp_1_CreateCourseAndReviewsDemo.main(HibernateApp_1_CreateCourseAndReviewsDemo.java:40)
课程实体类:
主要方法:
已创建表的SQL:
参考链接:
示例3:使用外键映射的单向一对多关联
//在客户类别中:
@OneToMany(孤立删除=真)
@JoinColumn(name=“CUST\u ID”)//join列位于订单的表中
公共集合getOrders(){return orders;}
休眠配置:
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:oracledb
冬眠
冬眠
1.
org.hibernate.dialen.oraclealent
真的
线
尝试了以下选项,但无效:
1。转义字符倒勾(“`”)
2.转义字符(“\”)
3.hibernate属性:true
请为此提供帮助!!!实际上,您的映射还可以。您应该只为
注释添加注释
@实体
@表(name=“review”)
公开课复习{
@列(名称=“`comment`”)
私有字符串注释;
// ...
}
实际上,您的映射还可以。您应该只为注释添加
@实体
@表(name=“review”)
公开课复习{
@列(名称=“`comment`”)
私有字符串注释;
// ...
}
最后,我将DB中的列名重命名为course\u comment
@Column(name="course_comment")
private String courseComment;
最后,我将DB中的列名重命名为course\u comment
@Column(name="course_comment")
private String courseComment;
我知道双向关系,它对我来说很好。问题是单向映射。更新了问题。如果我已经在使用外键,为什么还要添加链接?您必须更正您的数据库架构,以使用单向@OneToMany。正如我提到的,您需要在两个连接实体之间添加链接表,以便这。你能解释一下-模式中有什么问题吗?对于OneToMany单向映射,外键应该在目标实体中,这在我的情况下是正确的。我已经更正了我的答案。问题的根本原因完全是在另一个地方。;)它没有帮助…它现在给出了这个错误-,原因是:java.sql.SQLSyntaxErrorExcept离子:ORA-00904:“评论“:无效标识符
:|我知道双向关系,它对我很好。问题是单向映射。更新了问题。如果我已经在使用外键,为什么还要添加链接?您必须更正数据库模式,以使用单向@OneToMany。正如我提到的,在两个连接实体之间需要额外的链接表。您能解释一下模式中的错误吗?对于OneToMany单向映射,外键应该位于目标实体中,这在我的情况下是正确的。我已经更正了我的答案。问题的根本原因完全是在另一个地方这没用。。。它现在给出此错误-原因:java.sql.SQLSyntaxErrorException:ORA-00904:“comment”:无效标识符
:|
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure("hibernate-configuration.xml")
.addAnnotatedClass(Course.class)
.addAnnotatedClass(Review.class)
.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
try{
Course course = new Course("Hibernate - Beginner Course");
course.addReview(new Review("Great Course ... loved it."));
course.addReview(new Review("Cool Course ... well done!!"));
course.addReview(new Review("Dump Course .. You are an idiot."));
session.beginTransaction();
System.out.println("Saving the course :: " + course);
session.save(course);
session.getTransaction().commit();
} finally{
sessionFactory.close();
}
}
CREATE TABLE "COURSE"
(
"ID" NUMBER NOT NULL ENABLE,
"TITLE" VARCHAR2(50 BYTE) DEFAULT null,
PRIMARY KEY ("ID"),
);
CREATE TABLE "REVIEW"
(
"ID" NUMBER NOT NULL ENABLE,
"COMMENT" VARCHAR2(256 BYTE) DEFAULT null,
"COURSE_ID" NUMBER DEFAULT NULL,
PRIMARY KEY ("ID"),
FOREIGN KEY("COURSE_ID") REFERENCES "COURSE"("ID")
);
Example 3: Unidirectional One-to-Many association using a foreign key mapping
// In Customer class:
@OneToMany(orphanRemoval=true)
@JoinColumn(name="CUST_ID") // join column is in table for Order
public Set<Order> getOrders() {return orders;}
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:oracledb</property>
<property name="connection.username">hibernate</property>
<property name="connection.password">hibernate</property>
<!-- JDBC connection pool settings ... using built-in test pool -->
<property name="connection.pool_size">1</property>
<!-- Select our SQL dialect -->
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<!-- Echo the SQL to stdout -->
<property name="show_sql">true</property>
<!-- Set the current session context -->
<property name="current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
1. escaping character backtick ("`")
2. escaping character (""\")
3. hibernate property : <property name="hibernate.globally_quoted_identifiers">true</property>
@Column(name="course_comment")
private String courseComment;