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

议会文件

PK.java

范围2.java

戴维德

乍一看,有几件事似乎不正确:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

休眠:session.load VS session.get

在php上修改SESSION数据时使用POST或GET

为什么相关表值在使用List <>的HttpContext.Session.Get上为空?

通过跳过空值来连接列值

我如何在 Scrapy 中使用 requests.Session.get()。我自己尝试过,但出现错误

如何使用Hibernate通过Session.get()查询电子邮件ID?

如何从 requests.session 模拟 get 函数?

如何通过get方法在URL中使用php获取ul li的值

Java的休眠session.get构造函数中

了解休眠中的session.get和session.load方法

如何通过示例使用休眠查询来搜索ID?

如何通过使用日期作为 Quarkus 中的 @PathParam 在 REST API 中使用 GET METHOD 检索资源(对象)

如何使用Session:get()和withErrors()显示错误?

如何从打开的$ _SESSION中提取和使用数据值

相当于R中的get()的python(=使用字符串来检索符号的值)

包含 $_SESSION 和 $_GET 时未插入数据

你是使用 getter 还是让 http get 来检索挂载的数据?Vue 3 和 Vuex

如何在 .net core 2.0 api 中使用 session 获取和设置值

在PHP中使用session_name()-无法访问数据

URL变量到Session变量(使用GET方法)

通过aiohttp session.get请求时如何发送etag或上次修改

通过单击div更改PHP $ SESSION值

如何在C#中检索和使用通过Http GET请求获取的数据

通过Express-Session存储数据

sql查询以检索SESSION值

如何通过跳过columnB中的空值用熊猫数据框中的columnB替换columnA

如何通过entry.get()变量从SQL检索数据

如何从数据库中检索不为空的值

在R中使用get(ls())检索环境值