JPA没有坚持我的课

时间:2015-05-08 14:23:01

标签: java hibernate jpa

我是JPA的新手,我正在使用JPA 2.1开发软件。

它创建表,运行代码保存,JPA或Hibernate没有出现任何错误,当我读取相同的保存对象时,它为空

我的persistence.xml

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="CLFockinkPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>br.ind.fockink.model.Cliente</class>
    <class>br.ind.fockink.model.Funcionario</class>
    <class>br.ind.fockink.model.Licenca</class>
    <class>br.ind.fockink.model.PreCliente</class>
    <class>br.ind.fockink.model.Terceiro</class>
    <class>br.ind.fockink.model.Usuario</class>
    <properties>
        <!--  propriedades do hibernate -->
        <!-- Hibernate properties -->
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.hbm2ddl.auto" value="create-drop" />

        <!--  atualiza o banco, gera as tabelas se for preciso -->
        <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@xxxxxxxxx:1521:XE"/>
        <property name="javax.persistence.jdbc.user" value="sys as sysdba"/>
        <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
        <property name="javax.persistence.jdbc.password" value="xxxxx"/>


    </properties>
</persistence-unit>

我的班级:

public class PreCliente implements Serializable {

  private static final long serialVersionUID = 1L;
  // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
  @Id
  @Basic(optional = false)
  @SequenceGenerator(name = "WEB_SEQGRA2", sequenceName = "WEB_SEQGRA2", allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "WEB_SEQGRA2")
  @Column(name = "ID_PRE_CLIENTE")
  private Long idPreCliente;
  @Column(name = "CPF")
  private String cpf;
  @Column(name = "CNPJ")
  private String cnpj;
  @Column(name = "RAZAO_SOCIAL")
  private String razaoSocial;
  @Basic(optional = false)
  @Column(name = "NOME_SOBRENOME")
  private String nomeSobrenome;

持久化的通用DAO:

public class GenericDAO<PK, T> {
  private EntityManager entityManager;

  public GenericDAO(EntityManager entityManager) {
      this.entityManager = entityManager;
  }

  public T getById(PK pk) {
      return (T) entityManager.find(getTypeClass(), pk);
  }

  public void save(T entity) {
      entityManager.persist(entity);
  }

  public void update(T entity) {
      entityManager.merge(entity);
  }

  public void delete(T entity) {
      entityManager.remove(entity);
  }

  public List<T> findAll() {
      return entityManager.createQuery(("FROM " + getTypeClass().getName()))
              .getResultList();
  }

  private Class<?> getTypeClass() {
      Class<?> clazz = (Class<?>) ((ParameterizedType) this.getClass()
              .getGenericSuperclass()).getActualTypeArguments()[1];
      return clazz;
  }

DAO Extend GenericDAO:

public class PreClienteDAO extends GenericDAO<Long, PreCliente> {

  public PreClienteDAO(EntityManager entityManager) {
      super(entityManager);
  }

我的测试:

public static void main(String[] args) {
    // TODO code application logic here
    PreCliente pc = new PreCliente();
    pc.setCpf("123456789");
    pc.setNomeSobrenome("teste");
    PreClienteDAO dao = new PreClienteDAO(JPAUtil.getEntityManager());
    dao.save(pc);

    List<PreCliente> test = dao.findAll();
    System.out.println(test.get(0));
}

最后,hibernate返回:

Hibernate: 
create table PreCliente (
    ID_PRE_CLIENTE number(19,0) not null,
    CNPJ varchar2(255 char),
    CPF varchar2(255 char)
    NOME_SOBRENOME varchar2(255 char) not null,
    RAZAO_SOCIAL varchar2(255 char),
    primary key (ID_PRE_CLIENTE)
)
Hibernate: 
create sequence WEB_SEQGRA2
Hibernate: 
select
    WEB_SEQGRA2.nextval 
from
    dual
Hibernate: 
select
    precliente0_.ID_PRE_CLIENTE as ID_PRE_CLIENTE1_3_,
    precliente0_.CNPJ as CNPJ2_3_,
    precliente0_.CPF as CPF3_3_,
    precliente0_.NOME_SOBRENOME as NOME_SOBRENOME4_3_,
    precliente0_.RAZAO_SOCIAL as RAZAO_SOCIAL5_3_ 
from
    PreCliente precliente0_

返回任何内容的错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:638)
at java.util.ArrayList.get(ArrayList.java:414)
at br.ind.fockink.clfockink.main(clfockink.java:31)  

看看hibernate的返回,似乎他没有正确保存对象,但为什么呢?

3 个答案:

答案 0 :(得分:4)

在非托管环境中运行时,您必须自己打开,提交和回滚事务,例如:

height: 32px;

更多信息here

答案 1 :(得分:0)

entityManager.flush();
放在entityManager.persist()之后,因为entityManager.flush()操作可用于在提交事务之前强制将所有更改写入数据库,具体取决于EntityManager的方式(配置FlushModeType(更具体)。

您可以使用此链接阅读更多相关信息:

What does EntityManager.flush do and why do I need to use it?

答案 2 :(得分:-3)

您是否需要在此查询中选择一些内容?

         Client 1  Client 2  Combined
Amount    21,123    22,123    43,246
Discount   8,800     8,500    17,300
Charge         0     1,100     1,100
Potential  3,500     3,800     7,300

public List<T> findAll() { return entityManager.createQuery(("FROM " + getTypeClass().getName())) .getResultList(); }