线程 "main" org.hibernate.AnnotationException 中的异常:- 针对未映射的 class 使用 @OneToMany 或 @ManyToMany:
Exception in thread "main" org.hibernate.AnnotationException: - Use of @OneToMany or @ManyToMany targeting an unmapped class:
Java11
尝试使用 Hibernate
此处迁移sql:
create table client
(
id bigserial primary key,
name varchar(255),
phone varchar(255)
);
create sequence clientId start 1 NO MAXVALUE;
create table address_data_set
(
id bigserial primary key,
street varchar(255) not null,
client_id bigint not null references client(id)
);
create sequence addressId start 1 NO MAXVALUE;
此处实体:
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import static javax.persistence.GenerationType.SEQUENCE;
@Entity
@Table(name = "client")
public class Client {
@Id
@GeneratedValue(strategy = SEQUENCE, generator="clientId_generator")
@SequenceGenerator(name = "clientId_generator", sequenceName = "clientId", allocationSize = 1)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "addresses")
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<AddressDataSet> addresses = new ArrayList<>();
@Column(name = "phone")
private String phone;
}
还有一个
import javax.persistence.*;
import static javax.persistence.GenerationType.SEQUENCE;
@Entity
@Table(name = "address_data_set")
public class AddressDataSet {
@Id
@GeneratedValue(strategy = SEQUENCE, generator="addressId_generator")
@SequenceGenerator(name = "addressId_generator", sequenceName = "addressId", allocationSize = 1)
private Long id;
@Column(name = "street")
private String street;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "client_id", nullable = false)
private Client client;
}
然后像这样尝试 运行:
private Main() {
flywayMigrations();
var configuration = new Configuration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL10Dialect")
.setProperty("hibernate.connection.url", URL)
.setProperty("hibernate.connection.username", USER)
.setProperty("hibernate.connection.password", PASSWORD)
.setProperty("hibernate.show_sql", "true")
.setProperty("hibernate.hbm2ddl.auto", "validate")
.setProperty("hibernate.generate_statistics", "true");
var serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
var metadata = new MetadataSources(serviceRegistry)
.addAnnotatedClass(Client.class)
.getMetadataBuilder()
.build();
sessionFactory = metadata.getSessionFactoryBuilder().build();
}
private void flywayMigrations() {
logger.info("db migration started...");
var flyway = Flyway.configure()
.dataSource(URL, USER, PASSWORD)
.locations("classpath:/db/migration")
.load();
flyway.migrate();
logger.info("db migration finished.");
logger.info("***");
}
但我得到错误:
2022-01-13 19:53:45.784 INFO hw10.Main - db migration started...
2022-01-13 19:53:45.853 INFO o.f.c.i.license.VersionPrinter - Flyway Community Edition 7.1.1 by Redgate
2022-01-13 19:53:45.984 INFO o.f.c.i.database.base.DatabaseType - Database: jdbc:postgresql://localhost:5430/hw10 (PostgreSQL 12.9)
2022-01-13 19:53:46.050 INFO o.f.core.internal.command.DbValidate - Successfully validated 2 migrations (execution time 00:00.036s)
2022-01-13 19:53:46.063 INFO o.f.core.internal.command.DbMigrate - Current version of schema "public": 11
2022-01-13 19:53:46.064 INFO o.f.core.internal.command.DbMigrate - Schema "public" is up to date. No migration necessary.
2022-01-13 19:53:46.066 INFO hw10.Main - db migration finished.
2022-01-13 19:53:46.066 INFO hw10.Main - ***
Exception in thread "main" org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: hw10.model.Client.addresses[hw10.model.AddressDataSet]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1351)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:874)
at org.hibernate.cfg.annotations.CollectionBinder.secondPass(CollectionBinder.java:799)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:53)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1693)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1661)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:86)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:479)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
问题出在这个块:
@Column(name = "addresses")
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<AddressDataSet> addresses = new ArrayList<>();
您可以使用 @Column
或 @One/ManyToOne/Many
关系。你不能同时使用两者。第一个用于映射原始数据类型。另一个是实体关系。删除 @Column
就可以了。
更新
您添加了 Client
作为注释 class,但未添加 AddressDataSet
。将其添加到 addAnnotatedClass(Client.class)
:
下方
var metadata = new MetadataSources(serviceRegistry)
.addAnnotatedClass(Client.class)
.addAnnotatedClass(AddressDataSet.class)
.getMetadataBuilder()
.build();
Java11
尝试使用 Hibernate
此处迁移sql:
create table client
(
id bigserial primary key,
name varchar(255),
phone varchar(255)
);
create sequence clientId start 1 NO MAXVALUE;
create table address_data_set
(
id bigserial primary key,
street varchar(255) not null,
client_id bigint not null references client(id)
);
create sequence addressId start 1 NO MAXVALUE;
此处实体:
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import static javax.persistence.GenerationType.SEQUENCE;
@Entity
@Table(name = "client")
public class Client {
@Id
@GeneratedValue(strategy = SEQUENCE, generator="clientId_generator")
@SequenceGenerator(name = "clientId_generator", sequenceName = "clientId", allocationSize = 1)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "addresses")
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<AddressDataSet> addresses = new ArrayList<>();
@Column(name = "phone")
private String phone;
}
还有一个
import javax.persistence.*;
import static javax.persistence.GenerationType.SEQUENCE;
@Entity
@Table(name = "address_data_set")
public class AddressDataSet {
@Id
@GeneratedValue(strategy = SEQUENCE, generator="addressId_generator")
@SequenceGenerator(name = "addressId_generator", sequenceName = "addressId", allocationSize = 1)
private Long id;
@Column(name = "street")
private String street;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "client_id", nullable = false)
private Client client;
}
然后像这样尝试 运行:
private Main() {
flywayMigrations();
var configuration = new Configuration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL10Dialect")
.setProperty("hibernate.connection.url", URL)
.setProperty("hibernate.connection.username", USER)
.setProperty("hibernate.connection.password", PASSWORD)
.setProperty("hibernate.show_sql", "true")
.setProperty("hibernate.hbm2ddl.auto", "validate")
.setProperty("hibernate.generate_statistics", "true");
var serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
var metadata = new MetadataSources(serviceRegistry)
.addAnnotatedClass(Client.class)
.getMetadataBuilder()
.build();
sessionFactory = metadata.getSessionFactoryBuilder().build();
}
private void flywayMigrations() {
logger.info("db migration started...");
var flyway = Flyway.configure()
.dataSource(URL, USER, PASSWORD)
.locations("classpath:/db/migration")
.load();
flyway.migrate();
logger.info("db migration finished.");
logger.info("***");
}
但我得到错误:
2022-01-13 19:53:45.784 INFO hw10.Main - db migration started...
2022-01-13 19:53:45.853 INFO o.f.c.i.license.VersionPrinter - Flyway Community Edition 7.1.1 by Redgate
2022-01-13 19:53:45.984 INFO o.f.c.i.database.base.DatabaseType - Database: jdbc:postgresql://localhost:5430/hw10 (PostgreSQL 12.9)
2022-01-13 19:53:46.050 INFO o.f.core.internal.command.DbValidate - Successfully validated 2 migrations (execution time 00:00.036s)
2022-01-13 19:53:46.063 INFO o.f.core.internal.command.DbMigrate - Current version of schema "public": 11
2022-01-13 19:53:46.064 INFO o.f.core.internal.command.DbMigrate - Schema "public" is up to date. No migration necessary.
2022-01-13 19:53:46.066 INFO hw10.Main - db migration finished.
2022-01-13 19:53:46.066 INFO hw10.Main - ***
Exception in thread "main" org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: hw10.model.Client.addresses[hw10.model.AddressDataSet]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1351)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:874)
at org.hibernate.cfg.annotations.CollectionBinder.secondPass(CollectionBinder.java:799)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:53)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1693)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1661)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:86)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:479)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
问题出在这个块:
@Column(name = "addresses")
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<AddressDataSet> addresses = new ArrayList<>();
您可以使用 @Column
或 @One/ManyToOne/Many
关系。你不能同时使用两者。第一个用于映射原始数据类型。另一个是实体关系。删除 @Column
就可以了。
更新
您添加了 Client
作为注释 class,但未添加 AddressDataSet
。将其添加到 addAnnotatedClass(Client.class)
:
var metadata = new MetadataSources(serviceRegistry)
.addAnnotatedClass(Client.class)
.addAnnotatedClass(AddressDataSet.class)
.getMetadataBuilder()
.build();