使用JPA / Eclipselink进行对象关系映射(?)

时间:2015-03-29 11:19:33

标签: java postgresql jpa eclipselink

我正在进行一项练习,我们应该在Java中创建一个汽车租赁程序,其中所有数据都应该使用JPA和EclipseLink存储在PostgreSQL数据库中。

我设法创建了一个测试类,用于连接和存储/从数据库读取数据。现在我想知道如何让这个“大”汽车租赁计划与数据库一起工作......

我们有大约10个类(Car.java,Customer.java等),我认为它们基于前面的例子,应该连接到main / client-classes(Customer_Client.java,Admin_Client.java)等)使用Controller-class(?)。但我不太确定如何以及为什么。如果我理解正确,我认为连接代码等的数据库应该发生在main / client-classes中?

熟悉这种编程/建模(ORM)的人能指出我关于Controller类应该如何与客户端类一起工作的正确方向吗?

基于前面的例子,我想Controller-class应该包含一个getCars,getCustomers等方法,用于我需要在main / client-classes中访问的所有类?

我也想知道如何在数据库的表中添加“自定义”/类属性(例如Adress.java)?当我尝试使用与字符串和整数相同的方法时,例如Adress属性,我得到了这个例外:

异常说明:实体类[class no.hib.dat101.Customer]上属性[adress]的类型[类no.hib.dat101.Adress]不是序列化的有效类型map。属性类型必须实现Serializable接口。

我想这与数据库表有关 - 列只支持某些数据类型?

3 个答案:

答案 0 :(得分:0)

根据您的例外情况,您应该no.hib.dat101.Adress实施java.util.Serializable,以便在保存no.hib.dat101.Customer时将其标记为序列化。

答案 1 :(得分:0)

  

我想这与数据库表有关 - 列只支持某些数据类型?

不,您的问题与数据库无关。如何将implements Serializable添加到您的Adress类声明中?

更多地了解here

答案 2 :(得分:0)

ORM中的控制器类通常是DAO。 DAO是一种模式,它定义了如何从数据库创建/读取/更新/删除对象。一般DAO看起来像这样:

    public interface Dao<E> implements Serializable{

        public E find(int id);

        public void insert(E entity);

        public void update(E entity);

        public void delete(int id);
    }

它的实现(例如对于Car实体)看起来像这样:

    public class CarDao implements Dao<Car>{

        private EntityManager em;

        public Car find(int id){
            return em.find(id, Car.class);
        }   

        public void insert(Car entity){
            em.persist(entity);
        } 

        public void update(Car entity){
            em.merge(entity);
        }

        public void delete(int id){
            em.delete(find(id));
        }

    }

有关DAO模式的更多信息,请参阅Core J2EE Patterns - DAO(loooong但非常好阅读)或this link(阅读时间较短,但您会更快地了解DAO :))

实体更新/插入非常简单,例如,假设您要为某个客户设置新地址。

    private CustomerDao customerDao;

    private Addressdao addressDao;

    private int customerId;

    public void updateCustomerWithAddress(){
        Address address = new Address();
        //init address variables

        addressDao.insert(address);  

        Customer customer = customerDao.find(customerId); 

        //I assume you have a bidirectional oneToOne mapping between address and customer
        address.setCustomer(customer);
        customer.setAddress(address);

        customerDao.update(customer);      
    }

如果您遇到异常,则表示您的实体未实现Serializable接口。所以也许通过实现这个界面你将解决你的问题,但我们真的可以说很多,而不是真正看到代码本身。