如何解决如何通过在休眠中使用 session.get 检索数据来跳过空值
我想从数据库中检索一些数据,但有两个错误,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 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>
App.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","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.多对多关联
您在单个字段上使用了 @ManyToMany
:
@ManyToMany
private Parlamentare parlamentare;
这是不正确的,因为如果关联不使用 Parlamentare
,您将无法拥有多个 Collection
。您需要将其更改为:
@ManyToMany
Set<Parlamentare> parlamentari;
或
@ManyToOne
Parlamentare parlamentare;
如果它指的是单个parlamentare。
查看 Hibernate ORM 文档以获取 @ManyToMany
associations 和 @ManyToOne
associations 的示例。
2. @IdClass
您可以使用 @IdClass
to create composite identifiers,但您必须创建一个映射标识符的类:
@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 关联
@ManyToMany(mappedBy ="parlamentare",fetch=FetchType.EAGER)
private List<Range2<LocalDate>> periodo_carica = new ArrayList<Range2<LocalDate>>();
这可能是正确的,但通常不鼓励将关联映射为渴望。这可能会导致性能不佳,因为即使您不需要关联,它也会始终加载。
您可以仅在需要时急切地获取关联 via queries 或 via an entity graph。
为了懒惰,你可以将映射更改为:
@ManyToMany(mappedBy ="parlamentare",fetch=FetchType.LAZY)
private List<Range2<LocalDate>> periodo_carica = new ArrayList<Range2<LocalDate>>();
4.数组类型
示例:
String[] commissioni;
Hibernate ORM 会将此值保存为 an array of binary bytes。 我不确定这是否是你想要的。 This article about mapping arrays 解释所有选项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。