Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展DTO对象的更好解决方案(Java、Hibernate)_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

扩展DTO对象的更好解决方案(Java、Hibernate)

扩展DTO对象的更好解决方案(Java、Hibernate),java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我使用EmailAlert bean作为DTO,通过Hibernate获取数据。 因此,我的类只包含DB中的字段。 但在某些情况下,我需要在EmailAlert中添加其他字段以保存中间数据。例如,“caption”字段-将根据用户区域设置、时间等在java端计算 所以,我有一些变体来解决这个问题 向EmailAlert bean添加其他属性(例如:标题),但不要将其映射到DB表的任何字段。 缺点:在这种情况下,我们不能在hashCode()和equals()中使用“caption”属性,因为:

我使用EmailAlert bean作为DTO,通过Hibernate获取数据。 因此,我的类只包含DB中的字段。 但在某些情况下,我需要在EmailAlert中添加其他字段以保存中间数据。例如,“caption”字段-将根据用户区域设置、时间等在java端计算

所以,我有一些变体来解决这个问题

  • 向EmailAlert bean添加其他属性(例如:标题),但不要将其映射到DB表的任何字段。 缺点:在这种情况下,我们不能在hashCode()和equals()中使用“caption”属性,因为:

    • 它实际上没有物质场,只保存中间数据
    • 我不确定这是否是缓存和休眠本身出现问题的原因。
      我认为拥有class属性但不在equals()和hashCode()方法中使用它是非常丑陋的。
      将来可能会有人对这种逻辑感到困惑
  • 通过添加“caption”属性将EmailAlert扩展为EmailAlertExt。以及将EmailAlert作为参数的构造函数。
    但在这种情况下,我不确定是否会将EmailAlert作为EmailAlertExtBean再次存储到数据库中

  • 通过添加“caption”属性将EmailAlert扩展为EmailAlertExt2,并对原始对象进行引用。在本例中,EmailAlertExt2的行为将与原始EmailAlert相同,但需要附加属性。在保存EmailAlert的情况下,我们可以调用EmailAlertExt2的getOriginalValue(),它将返回对原始对象的引用。 缺点:编码太多:)


  • 伙计们,这些解决方案中哪一个更好?可能有人有其他建议?

    使用'@Transient'它不会映射到db hibernate将忽略此字段

    使用'@Transient'它不会映射到db hibernate将忽略此字段

    听起来您目前需要的EmailAlert对象是一个业务对象,因为“中间数据”和“在java端计算”位


    可能使用EmailAlertDto对象填充EmailAlertBusiness的字段,并在业务对象中存储额外的标题字段和方法。

    由于“中间数据”和“在java端计算”位,您目前需要的EmailAlert对象听起来像是一个业务对象


    可能使用EmailAlertDto对象来填充EmailAlertBusiness的字段,并在业务对象中存储额外的标题字段和方法。

    仅仅因为要分离映射字段和非映射字段而扩展模型对象不是一个好主意。一个很好的指导原则是问自己这样一个问题:“EmailAlert和EmailAlertX之间有什么区别,我可以清楚地定义使用一种方法而不是另一种方法的情况吗?”。如果您不能清楚地回答这个问题,或者如果您意识到您将始终使用子类而不是父类,那么这肯定表明父类应该是抽象的,或者您有太多的类

    在您的特定情况下,将映射属性和非映射属性都放在同一个类上,并标记非映射属性,以便您的ORM提供程序不会尝试处理它们,这将更有意义。可以通过将这些属性注释为@Transient来实现这一点

    public class EmailAlert implements Serializable {
       @Id
       private Long id;
    
       @Column(name = "recipient")
       private String recipient;
    
       @Transient
       private transient String caption;
    
       // Constructor, Getters/Setters, etc
    }
    
    另外,关于您对hashcode/equals方法的评论。您不应该也不应该在这些方法中包含JavaBean的每个属性。仅包括以下属性:

    • 需要唯一标识对象
    • (公平地)保证在对象的生命周期中具有相同的价值

    仅仅因为要分离映射字段和非映射字段而扩展模型对象不是一个好主意。一个很好的指导原则是问自己这样一个问题:“EmailAlert和EmailAlertX之间有什么区别,我可以清楚地定义使用一种方法而不是另一种方法的情况吗?”。如果您不能清楚地回答这个问题,或者如果您意识到您将始终使用子类而不是父类,那么这肯定表明父类应该是抽象的,或者您有太多的类

    在您的特定情况下,将映射属性和非映射属性都放在同一个类上,并标记非映射属性,以便您的ORM提供程序不会尝试处理它们,这将更有意义。可以通过将这些属性注释为@Transient来实现这一点

    public class EmailAlert implements Serializable {
       @Id
       private Long id;
    
       @Column(name = "recipient")
       private String recipient;
    
       @Transient
       private transient String caption;
    
       // Constructor, Getters/Setters, etc
    }
    
    另外,关于您对hashcode/equals方法的评论。您不应该也不应该在这些方法中包含JavaBean的每个属性。仅包括以下属性:

    • 需要唯一标识对象
    • (公平地)保证在对象的生命周期中具有相同的价值

    这是有用的广泛评论。谢谢这是有益的广泛评论。谢谢