【问题标题】:DAO MVC: why my class is NOT POJODAO MVC:为什么我的课不是 POJO
【发布时间】:2013-04-09 18:52:54
【问题描述】:

我使用 DAO MVC,经过一番谷歌搜索后,我考虑将一些变量存储为 java 中的枚举MySQL 中的字符串。所以我在 Item.java 中创建(将持久化到 Item 表中)静态初始化和静态方法将 Enum 转换为 String,反之亦然。 但是有人说我在这个静态初始化和静态方法之后,我的 Item.java 类变成了 NOT POJO。

问题

  1. 为什么它变成了 NOT POJO?
  2. 如果我将这些方法设为非静态 Item.java 类将是 POJO?

已编辑:我的代码:

package model;

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class Order {

    public enum OrderStatus {
        NOT_REVIEWED,
        APPROVED,
        REJECTED,
        RETURNED
    } 

    // ==================
    // =   Transient    = 
    // ==================
    private static final Map<String, OrderStatus> convertStringToOrderStatusMap = new HashMap<String, OrderStatus>(3);
    private static final Map<OrderStatus, String> convertOrderStatusToStringMap = new EnumMap<OrderStatus, String>(OrderStatus.class);

    static {
        convertStringToOrderStatusMap.put("not reviewed", OrderStatus.NOT_REVIEWED);
        convertStringToOrderStatusMap.put("approved", OrderStatus.APPROVED);
        convertStringToOrderStatusMap.put("rejected", OrderStatus.REJECTED);
        convertStringToOrderStatusMap.put("returned", OrderStatus.RETURNED);
        convertOrderStatusToStringMap.put(OrderStatus.NOT_REVIEWED, "not reviewed");
        convertOrderStatusToStringMap.put(OrderStatus.APPROVED, "approved");
        convertOrderStatusToStringMap.put(OrderStatus.REJECTED, "rejected");
        convertOrderStatusToStringMap.put(OrderStatus.RETURNED, "returned");
    }
    // ==================
    // =   Attributes   = 
    // ==================
    private Integer orderId; //Primary key
    private OrderStatus status;
    private Integer reimbursement;
    private String firstName;
    private String secondName;
    private String passportData;
    private String pickUpDate; 
    private String dropOffDate;
    //java.util.Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2011-05-18 16:29:31");
    private String customerCell;
    private String customerAddress;

    // ==================
    // =  Foreign Keys  = 
    // ==================
    private User user;
    private Car car;

    // ==================
    // = Public methods = 
    // ==================

    public Integer getOrderId() {
        return orderId;
    }

    public void setOrderId(Integer orderId) {
        this.orderId = orderId;
    }

    public String getStatus() {
        return convertOrderStatusToString(status);
    }
    public void setStatus(OrderStatus status) {
        this.status = status;
    }

    public Integer getReimbursement() {
        return this.reimbursement;
    }

    public void setReimbursement(Integer value) {
        this.reimbursement = value;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSecondName() {
        return secondName;
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    public String getPassportData() {
        return passportData;
    }

    public void setPassportData(String passportData) {
        this.passportData = passportData;
    }

    public String getPickUpDate() {
        return pickUpDate;
    }

    public void setPickUpDate(String pickUpDate) {
        this.pickUpDate = pickUpDate;
    }

    public String getDropOffDate() {
        return dropOffDate;
    }

    public void setDropOffDate(String dropOffDate) {
        this.dropOffDate = dropOffDate;
    }

    public String getCustomerCell() {
        return customerCell;
    }

    public void setCustomerCell(String customerCell) {
        this.customerCell = customerCell;
    }

    public String getCustomerAddress() {
        return customerAddress;
    }

    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public static OrderStatus converStringToOrderStatus(String status) {
        return convertStringToOrderStatusMap.get(status);
    }

    public static String convertOrderStatusToString(OrderStatus status) {
        return convertOrderStatusToStringMap.get(status);
    }
}

【问题讨论】:

  • 粘贴你的代码,我会告诉你是否做错了。
  • 我是不是在做坏事?
  • 不错,但可能会更好。我会使用EnumMap 来制作convertOrderStatusToStringMap,而使用番石榴的 ImmutableMap.Builder 来制作另一张地图。如果您使用最新的番石榴,那么您将拥有其ImmutableEnumMap builder you can use

标签: mysql jsp jpa persistence pojo


【解决方案1】:

因为 Plain Old Java Object 只有数据。添加逻辑和方法意味着它不再是普通的旧 Java 对象。

这并不一定是一件坏事,但您也许可以将逻辑重构为它自己的类。

【讨论】:

  • 这不是我对 POJO 含义的理解(参见en.wikipedia.org/wiki/Plain_Old_Java_Object)。 POJO 可以有方法。使它成为 POJO 的原因在于它是否依赖于外部类(例如,从框架类继承或依赖于注解)。
  • 其实POJO的定义有些模糊。
  • 这真的取决于他是在做 SOA 还是 DDD。例如,Spring Roo 制作了增强的 AspectJ @Configurable POJO,他们称之为遵循 Active Record 模式的 POJO。
  • “因为一个普通的旧 Java 对象只有数据”...我认为“只有数据”是 Java Bean 的更好定义,它基于属性的 setter 和 getter里面没有逻辑。
  • 我的 Item.class(必须是 POJO)具有内部枚举类并在静态方法中使用此类。我应该怎么做才能使它成为 POJO?
【解决方案2】:

让我们忽略 POJO。

他们的意思是面向服务与领域驱动。

面向服务遵循严格的行为与状态分离。他们将 POJO 称为数据对象,这些数据对象本质上是美化的结构。因此,您可以将静态方法放在服务中。事实上,您可能甚至不希望方法是静态的,因为这也违反了面向服务的方法(请参阅依赖注入和邪恶的单例)。

Domain Driven 遵循经典 OOP(例如 Rails Active Record)的理念,他们相信在他们的 POJO 中放置行为是可以的。因此,由于状态 + 行为是耦合的,因此只有一种实现,因此领域对象中的静态方法是可以的。

如果您采用 DAO 路线,您最有可能采用面向服务的方式。我的意见是,如果您要执行 DAO POJO 路由,您应该为这些数据对象使用 immutable objects (shameless plug)

据我所知,最后将内联 enum 放入一个类中不会违反 POJO 的任何定义。话虽如此,自从您使用 JPA 以来,您应该了解 @Enumerated

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2018-06-16
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2012-03-13
    • 2014-10-08
    相关资源
    最近更新 更多