【问题标题】:Object-relational mapping(?) with JPA/Eclipselink使用 JPA/Eclipse 的对象关系映射(?)link
【发布时间】:2015-03-29 11:19:33
【问题描述】:

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

我已经成功地创建了一个测试类,用于连接和存储/读取数据库中的数据。现在我想知道我应该如何继续使这个“大”汽车租赁程序与数据库一起工作......

我们有大约 10 个类(Car.java、Customer.java 等),我认为基于前面的示例,它们应该连接到主/客户端类(Customer_Client.java、Admin_Client.java等)使用控制器类(?)。但我不太确定如何以及为什么。如果我理解正确的话,我认为数据库连接代码等应该发生在主/客户端类中?

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

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

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

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

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

【问题讨论】:

    标签: java postgresql jpa eclipselink


    【解决方案1】:

    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(很长,但读起来非常好)或 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 接口。所以也许通过实现这个接口你会解决你的问题,但我们真的可以说很多,而不需要真正看到代码本身。

    【讨论】:

    • 谢谢!这正是我想要的。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,这解决了它。但是现在,我该如何继续使用 Controller 类呢?有什么想法吗?
    【解决方案3】:

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

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

    阅读更多here

    【讨论】:

      猜你喜欢
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多