JPA/Eclipselink 的对象关系映射(?)

Object-relational mapping(?) with JPA/Eclipselink

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

我已经设法创建了一个测试-class,它连接并stores/reads 数据to/from 数据库。现在我想知道我应该如何继续使这个 "big" 汽车租赁程序与数据库一起工作...

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

熟悉这种 programming/modelling (ORM) 的人能否为我指出控制器-class 应如何与客户端-class 协同工作的正确方向是吗?

根据前面的示例,我猜 Controller-class 应该包含一个 getCars、getCustomers 等方法,用于我需要在 main/client-classes 中访问的所有 classes ?

我也想知道我应该如何添加 "custom"/class 属性(例如 Adress.java)作为数据库中 table 的列?当我尝试使用与 String 和 Integers 相同的方法时,例如Adress 属性,我得到这个异常:

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

我猜这与数据库有关table-列仅支持某些数据类型?

根据您的异常,您应该让 no.hib.dat101.Adress 实现 java.util.Serializable,以便在保存 no.hib.dat101.Customer 时标记为序列化。

I guess this has something to do with the database table-column only supports certain datatypes?

不,您的问题与数据库无关。将 implementsSerializable 添加到 Adress class 声明中怎么样?

阅读更多 here

ORM 中的控制器class 通常是 DAO。 DAO 是一种模式,它定义了如何从数据库中 create/read/update/delete 对象。一般的 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 but VERY good reading) or this link(阅读较短,但您会更快地了解有关 DAO 的一般概念:))

实体 update/insert 非常简单,例如假设您想为某个客户设置一个新地址。

    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);      
    }

如果您遇到异常,它表示您的实体未实现可序列化接口。所以也许通过实现这个接口你会解决你的问题,但我们真的可以在没有实际看到代码本身的情况下说很多。