微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过在休眠中使用 session.get 检索数据来跳过空值

如何解决如何通过在休眠中使用 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)

Parlamentare.java

PK.java

Range2.java

解决方法

有几件事乍一看似乎不对:

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 queriesvia 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 举报,一经查实,本站将立刻删除。