我想从数据库中检索一些数据,但有两个错误,NullPointerException 和“无法定位持久器”。我的数据库中有空值,如何跳过?它不应该使用我在 session.get 中提供的特定主键检索元组吗?然后元组存在于我的数据库中,为什么它告诉我它不是持久的?谢谢。
Parliamentary class
@Entity
@Table(name = "parlamentari")
@IdClass(Parlamentare.class)
public class Parlamentare implements Serializable{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "nome")
String nome;
@Id
@Column(name = "partito")
String partito;
@Id
@Column(name = "circoscrizione")
String circoscrizione;
Date data_nascita;
String luogo;
String titolo_studi;
String[] mandati;
String[] commissioni;
//DateRange[] periodo_carica;
@ManyToMany(mappedBy = "parlamentare",fetch=FetchType.EAGER)
private List<Range2<LocalDate>> periodo_carica = new ArrayList<Range2<LocalDate>>();
public Parlamentare() {
this.nome = "";
this.partito = "";
this.circoscrizione = "";
this.data_nascita = null;
this.luogo = null;
this.titolo_studi = "";
this.mandati = null;
this.commissioni = null;
this.periodo_carica = null;
}
public Parlamentare(String nome, String partito, String circoscrizione) {
super();
this.nome = nome;
this.partito = partito;
this.circoscrizione = circoscrizione;
}
public Parlamentare(String nome, String partito, String circoscrizione, Date data_nascita, String luogo,
String titolo_studi, String[] mandati, String[] commissioni, List<Range2<LocalDate>> periodo_carica) {
super();
this.nome = nome;
this.partito = partito;
this.circoscrizione = circoscrizione;
this.data_nascita = data_nascita;
this.luogo = luogo;
this.titolo_studi = titolo_studi;
this.mandati = mandati;
this.commissioni = commissioni;
this.periodo_carica = periodo_carica;
}
....
}
}
Range2 类与 Vlad Mihalcea 的 Range 类相同,但增加了:
@ManyToMany
private Parlamentare parlamentare;
public Parlamentare getParlamentare() {
return parlamentare;
}
public void setParlamentare(Parlamentare parlamentare) {
this.parlamentare = parlamentare;
}
hibernate.cfg.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost/Parlamento</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
应用程序.java
public class App
{
private static ServiceRegistry serviceregistry;
private static SessionFactory sf;
public static SessionFactory getSessionFactory() {
if (sf == null) {
StandardServiceRegistry standardRegistry = new
StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
sf = metadata.getSessionFactoryBuilder().build();
}
return sf;
}
public static void main( String[] args )throws ParseException, NullPointerException{
Parlamentare parlamentare = new Parlamentare();
Configuration con = new
Configuration().configure().addAnnotatedClass(Parlamentare.class).addAnnotatedClass(Range2.class);
//serviceregistry.applySettings(con.getProperties()).buildServiceRegistry();
getSessionFactory();
serviceregistry = new
StandardServiceRegistryBuilder().applySettings(con.getProperties()).build();
try {
sf = con.buildSessionFactory(serviceregistry);
} catch (NullPointerException e) {
e.printStackTrace();
}
Session session = sf.openSession();
session.beginTransaction();
parlamentare = (Parlamentare) session.get(Parlamentare.class,
new Parlamentare("Abate Rosa Silvana","M5S", "Calabria"));
//parlamentare.getpk("Abate Rosa Silvana","M5S", "Calabria"));
System.out.println(parlamentare.getNome());
System.out.println(parlamentare.getPartito());
System.out.println(parlamentare.getCircoscrizione());
System.out.println(parlamentare.getData_nascita());
System.out.println(parlamentare.getLuogo());
System.out.println(parlamentare.getTitolo_studi());
System.out.println(parlamentare.getMandati());
System.out.println(parlamentare.getCommissioni());
System.out.println(parlamentare.getPeriodo_carica());
List<Range2<LocalDate>> periodo_carica = new ArrayList<Range2<LocalDate>>();
periodo_carica = parlamentare.getPeriodo_carica();
for(Range2<LocalDate> dr : periodo_carica)
{
System.out.println(dr);
}
session.getTransaction().commit();
// tx.commit();
session.close();
sf.close();
}
}
OUTPUT:
mag 01, 2021 10:49:19 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.4.30.Final
mag 01, 2021 10:49:19 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager
<clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
mag 01, 2021 10:49:20 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
mag 01, 2021 10:49:20 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [org.postgresql.Driver] at URL
[jdbc:postgresql://localhost/Parlamento]
mag 01, 2021 10:49:20 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=postgres}
mag 01, 2021 10:49:20 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
mag 01, 2021 10:49:20 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections
<init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
mag 01, 2021 10:49:21 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
mag 01, 2021 10:49:24 AM
org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl
getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@7 a18e8d] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will
be committed and the Connection will be set into auto-commit mode.
mag 01, 2021 10:49:25 AM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator
initiateService
INFO: HHH000490: Using JtaPlatform implementation:
[org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
mag 01, 2021 10:49:25 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
mag 01, 2021 10:49:25 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [org.postgresql.Driver] at URL
[jdbc:postgresql://localhost/Parlamento]
mag 01, 2021 10:49:25 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=postgres}
mag 01, 2021 10:49:25 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
mag 01, 2021 10:49:25 AM
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections
<init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
mag 01, 2021 10:49:26 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
java.lang.NullPointerException at
org.hibernate.cfg.ColumnsBuilder.extractMetadata(ColumnsBuilder.java:144) at
org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1685) at
org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:2790) at
org.hibernate.cfg.AnnotationBinder.bindIdClass(AnnotationBinder.java:2893) at
org.hibernate.cfg.AnnotationBinder.mapAsIdClass(AnnotationBinder.java:1063) at
org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:791) at
org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.
processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:248) at
org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies
(MetadataBuildingProcess.java:239) at
org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete
(MetadataBuildingProcess.java:282) 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) at
org.hibernate.cfg.Configuration.buildSessionFactory
(Configuration.java:689) at
swt.mvn.Parlamento.App.main(App.java:132)
Exception in thread "main" org.hibernate.UnknownEntityTypeException:
Unable to locate persister:
swt.mvn.Parlamento.src.Servlet_Parlamento.Parlamentari.Parlamentare at
org.hibernate.metamodel.internal.MetamodelImpl.locateEntityPersister(MetamodelImpl.java:721) at
org.hibernate.internal.SessionImpl.locateEntityPersister(SessionImpl.java:2946) at
org.hibernate.internal.SessionImpl.access$1800(SessionImpl.java:193) at
org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2675) at
org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2658) at
org.hibernate.internal.SessionImpl.byId(SessionImpl.java:1140) at
org.hibernate.internal.SessionImpl.get(SessionImpl.java:983) at
swt.mvn.Parlamento.App.main(App.java:139)
乍一看,有几件事似乎不正确:
1.多对多关联
You used a @ManyToMany
on a single field:
@ManyToMany
private Parlamentare parlamentare;
This is not correct because you cannot have many Parlamentare
if the association doesn't use a Collection
. You need to change it to:
@ManyToMany
Set<Parlamentare> parlamentari;
or
@ManyToOne
Parlamentare parlamentare;
If it refers to a single parlamentare.
Check the Hibernate ORM documentation for examples of @ManyToMany
associations and @ManyToOne
associations.
2. @IdClass
You can use @IdClass
to create composite identifiers, but you have to create a class that maps the identifier:
@Entity
@Table(name = "parlamentari")
@IdClass(ParlamentarePK.class)
public class Parlamentare implements Serializable{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "nome")
String nome;
@Id
@Column(name = "partito")
String partito;
@Id
@Column(name = "circoscrizione")
String circoscrizione;
...
}
public class ParlamentarePK implements Serializable {
String nome;
String partito;
String circoscrizione;
...// getters,setters and so on
}
3. EAGER associations
@ManyToMany(mappedBy ="parlamentare",fetch=FetchType.EAGER)
private List<Range2<LocalDate>> periodo_carica = new ArrayList<Range2<LocalDate>>();
This might be correct, but it's usually discouraged to map associations as eager. It may lead to poor performance because the association will always be loaded even when you don't need it.
为了使它变得懒惰,您可以将映射更改为:
@ManyToMany(mappedBy ="parlamentare",fetch=FetchType.LAZY)
private List<Range2<LocalDate>> periodo_carica = new ArrayList<Range2<LocalDate>>();
4. 数组作为类型
示例:
String[] commissioni;
Hibernate ORM 将这些值保存为一个二进制字节数组。我不确定这是否是你想要的。这篇关于映射数组的文章解释了所有选项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句