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



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

我已经设法创建了一个测试类,它将数据连接到数据库并从数据库中存储/读取数据。现在我想知道我应该如何让这个"大"租车计划与数据库协同工作。。。

我们有大约10个类(Car.java、Customer.java等),我认为基于前面的示例,这些类应该使用Controller类(?)连接到主/客户端类(Customer_client.java、Admin_client.jap等)。但我不太确定是怎么做的,为什么。如果我理解正确的话,我认为数据库连接代码等应该发生在主/客户端类中?

熟悉这种编程/建模(ORM)的人能为我指出控制器类应该如何与客户端类协同工作的正确方向吗?

基于前面的例子,我想Controller类应该包含一个getCars、getCustomers等方法,用于我需要在主/客户端类中访问的所有类?

我还想知道如何在数据库的表中添加"自定义"/类属性(例如Adress.java)作为列?当我尝试使用与字符串和整数相同的方法来处理例如Adress属性时,我会得到以下异常:

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

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

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模式的更多信息,请参阅核心J2EE模式-DAO(很好的阅读)或此链接(阅读时间较短,但你会更快地了解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接口。所以,也许通过实现这个接口,你会解决你的问题,但我们真的可以在没有看到代码本身的情况下说很多。

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

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

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

点击此处了解更多信息。

最新更新