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?
不,您的问题与数据库无关。将 implements
Serializable
添加到 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);
}
如果您遇到异常,它表示您的实体未实现可序列化接口。所以也许通过实现这个接口你会解决你的问题,但我们真的可以在没有实际看到代码本身的情况下说很多。
我正在做一个练习,我们应该在 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?
不,您的问题与数据库无关。将 implements
Serializable
添加到 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);
}
如果您遇到异常,它表示您的实体未实现可序列化接口。所以也许通过实现这个接口你会解决你的问题,但我们真的可以在没有实际看到代码本身的情况下说很多。