我写了一个教育项目。这是一个简单的聊天。后端技术的堆栈是Java,Jetty(服务器,websocket),Hibernate 5.3.7.Final,PostgreSQL。
我有一个运行时异常org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [conversation_c_id] in table [conversation_reply]
。错误使我在几天之内开心了。感谢您为解决此问题所提供的帮助。
这是实体部分的基本结构:
@Entity
@Table(name = "conversation") //public class ConversationDataSet
@Id
@SequenceGenerator(name = "cIdSequence", sequenceName = "c_id_sequence", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cIdSequence")
@Column(name = "c_id", nullable = false, updatable = false)
private long cId;
@OneToMany(mappedBy = "conversation", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ConversationReplyDataSet> conversationReplies = new ArrayList<>();
@Entity
@Table(name = "conversation_reply") //public class ConversationReplyDataSet
@Id
@SequenceGenerator(name = "crIdSequence", sequenceName = "cr_id_sequence", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "crIdSequence")
@Column(name = "cr_id", nullable = false, updatable = false)
private long crId;
@Column(name = "c_id_fk")
private long cIdFk;
@ManyToOne(fetch = FetchType.LAZY)
private ConversationDataSet conversation;
SQL模式为:
create table conversation
(
c_id bigint not null primary key
);
create table conversation_reply
(
cr_id bigint not null primary key,
c_id_fk bigint not null,
constraint fk_c_id_fk foreign key (c_id_fk) references conversation(c_id)
);
堆栈跟踪:
org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [conversation_c_id] in table [conversation_reply]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:136)
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
at dbService.DBServiceImpl.createSessionFactory(DBServiceImpl.java:155)
at dbService.DBServiceImpl.<init>(DBServiceImpl.java:42)
at main.Main.main(Main.java:23)
以防Hibernate配置为:
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL94Dialect");
configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
configuration.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost:5432/chatroomdb");
configuration.setProperty("hibernate.connection.username", "someusername");
configuration.setProperty("hibernate.connection.password", "somepassword");
configuration.setProperty("hibernate.show_sql", "true");
configuration.setProperty("hibernate.hbm2ddl.auto", "validate");
// configuration.setProperty("hibernate.implicit_naming_strategy", "legacy-jpa");
谢谢。
答案 0 :(得分:0)
将您的ManyToOne关系更改为此:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "c_id_fk")
private ConversationDataSet conversation;
并删除此
@Column(name = "c_id_fk")
private long cIdFk;
您可以在此处阅读更多内容 https://en.wikibooks.org/wiki/Java_Persistence/ManyToOne#Example_of_a_ManyToOne_relationship_annotations