Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA JPA—持久化项目中所有对象的常规解决方案_Java_Hibernate_Jpa_Persist - Fatal编程技术网

JAVA JPA—持久化项目中所有对象的常规解决方案

JAVA JPA—持久化项目中所有对象的常规解决方案,java,hibernate,jpa,persist,Java,Hibernate,Jpa,Persist,我正在开发一个后端,它可以创建新的用户、新闻、各种数据等 到目前为止,我可以在数据库中创建并保留一个新用户。我认为还会有更多的实体与关系。在这一点上,我只看到两种保存数据的方法: 创建CreateXY、UpdateXY和DeleteXY类 或者在每个实体对象中对persist方法进行编码 我认为一次又一次地写文章是多余的。有没有一种很好的方法来保存对象 Main.java package database; import java.util.logging.Level; import ja

我正在开发一个后端,它可以创建新的用户、新闻、各种数据等

到目前为止,我可以在数据库中创建并保留一个新用户。我认为还会有更多的实体与关系。在这一点上,我只看到两种保存数据的方法:

  • 创建CreateXY、UpdateXY和DeleteXY类
  • 或者在每个实体对象中对persist方法进行编码
我认为一次又一次地写文章是多余的。有没有一种很好的方法来保存对象

Main.java

package database;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import backend.User;

public class Main {
    private static final Logger LOGGER = Logger.getLogger("JPA");

    public static void main(String[] args) {
        Main main = new Main();
        main.run();
    }

    public void run() {
        EntityManagerFactory factory = null;
        EntityManager entityManager = null;
        try {
            System.out.println("START");
            factory = Persistence.createEntityManagerFactory("shareiffUnit");
            System.out.println("END");
            entityManager = factory.createEntityManager();
            persistPerson(entityManager);
        } catch (Exception e) {
            LOGGER.log(Level.SEVERE, e.getMessage(), e);
            e.printStackTrace();
        } finally {
            if (entityManager != null) {
                entityManager.close();
            }
            if (factory != null) {
                factory.close();
            }
        }
    }

    private void persistPerson(EntityManager entityManager) {
        EntityTransaction transaction = entityManager.getTransaction();
        try {
            transaction.begin();
            User person = new User();
            person.setName("Homer");
            person.setPassword("Simpson");
            entityManager.persist(person);
            transaction.commit();
        } catch (Exception e) {
            if (transaction.isActive()) {
                transaction.rollback();
            }
        }
    }

}
User.java

package backend;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class User {

    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String password;
    private Boolean isActive = false;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Boolean isActive() {
        return isActive;
    }
    public void setActive(boolean isActive) {
        this.isActive = isActive;
    }

}

我倾向于拥有一组类似于经理的类,以及每个经理类的基础。基础类似于:

public class SomeBaseWritableDAO<T> {
    @PersistenceContext
    private EntityManager entityManager;

    protected EntityManager getEntityManager() {
        return entityManager;
    }

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

    public T update(T entity) {
        return getEntityManager().merge(entity);
    }

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

有其他方法可以做到这一点,但这种模式在过去运作良好。如果您拥有一个具有引用完整性的正确设计的数据库,那么像Eclipse或IntelliJ中的一个好的反向工程工具可以生成您的一对一和一对多关系。

您是否在某种IDE中工作?他们中的许多人可以为您生成JPA代码。但不确定这是否是所有人的复制粘贴。如果我改变了一些东西,怎么保存数据?然后我还要修改所有的类,然后重新生成代码。但请看下面我的答案。
public class SpecificDAO extends SomeBaseWritableDAO<SpecificEntity> {

    public SpecificEntity findBySomeCode(String inviteCode) {
        final String queryString = "select model from SomeEntity model " +
                "where model.code= :inviteCode";

        Query query = getEntityManager().createQuery(queryString);
        query.setParameter("inviteCode", inviteCode);

        try {
            return (SomeEntity) (query.getSingleResult());
        }
        catch( NoResultException nre ) {
            return null;
        }
    }
}