【问题标题】:Do entity classes always need IDs?实体类总是需要 ID 吗?
【发布时间】:2012-11-02 15:27:28
【问题描述】:

好吧,我想知道我们是否总是需要在实体类中拥有一个 id 字段?我听说在实体类中总是有一个 id 字段是一种不好的做法,因为它会绑定到数据库,即使您可能根本不需要数据库。

就我而言,我有这样的课程:

public class User {
private String firstName = "";
private String lastName = "";
private String personCode = "";
private Date birthDate = new Date();
private Gender gender = Gender.MALE;
private String email = "";
private String password = "";
private UserState userState = UserState.UNAPPROVED;

在我的例子中,我使用他们的电子邮件地址来识别用户。 这个类相当于数据库中的一个表,确实有一个额外的 userId 字段,它唯一地标识它。 现在我在问我是否需要在这个java类中添加一个idUser字段?

我已经设法用 Hibernate 像这样映射它:

<class
    name="User"
    table="User"
    discriminator-value="U" >

    <!-- <id column="idUser" type="long" /> this one wouldn't even work... -->
    <id name="email" />

    <discriminator column="discriminator" type="string" />

    <property name="firstName" />
    <property name="lastName" />
    <property name="personCode" />
    <property name="birthDate" type="date"/>

   <property name="userState" column="userState" length="15">
         <type name="org.hibernate.type.EnumType">
              <param name="enumClass">com.nortal.pirs.datamodel.enumeration.UserState</param>
              <param name="type">12</param>
          </type>
    </property>

    <property name="password" />

     <property name="gender" column="gender" length="15">
         <type name="org.hibernate.type.EnumType">
              <param name="enumClass">com.nortal.pirs.datamodel.enumeration.Gender</param>
              <param name="type">12</param>
          </type>
    </property>


     <subclass name="Patient" extends="User" discriminator-value="P" >
         <property name="additionalInfo" column="additionalInfo" />

     </subclass>

     <subclass name="SpiProfessional" extends="User" discriminator-value="S" />


</class>

现在扩展 User 的 Patient 和 SpiProfessional 有他们唯一的 id,这也有点愚蠢,这也只在数据库中可见。

到目前为止,我还没有设法通过休眠来保存 Patient 和 SpiProfessional。我收到此错误:

2012-11-14 07:36:44,265 [main] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1054, SQLState: 42S22
2012-11-14 07:36:44,266 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unknown column 'additionalInfo' in 'field list'

谁能解释一下在java类中有id的问题?还有人知道如何用hibernate解决这个问题吗?

【问题讨论】:

  • 简而言之,实体中总是需要ID。它用于标识一个实体。

标签: java database hibernate entity


【解决方案1】:

这可能有助于定义您对实体的理解。如果您正在考虑“只是一个带有数据库后端的对象”,那么您并没有了解全部情况。

Eric Evans 将Entity in Domain Driven Design 定义为:

““主要由其身份定义的对象称为实体。” [埃文斯 2003]"

实体是在整个生命周期中具有连续性的任何事物,并且 独立于重要的属性的区别 应用程序的用户。 [埃文斯 2003]

这里需要注意的重要一点是,在应用程序的任何级别,对象都应该是唯一可识别的,并且有一个生命周期,它将改变状态(并可能触发事件),然后它使感觉有一些唯一标识它的属性概念。

基于整数的 id 历来被用于提高效率:在计算上判断 2 个数字是否相等比重复比较不同属性更容易。

【讨论】:

  • 我明白了。嗯,但它现在变得相当复杂,因为 Patient 和 SpiProfessional 类扩展了它,并且在我的数据库方案中我添加了它们自己的主键。它们是否应该共享相同的 id,我们会区分使用是 SpiProfessional、Patient 还是两者都带有鉴别器?或者他们所有人都可以拥有自己独特的 ID?愚蠢的是,由于 id 现在出现在我的 java 类中,所以耐心和 spiprofessional 类也继承了 idUser...
  • RDBMS 不能很好地支持继承。这是经常令人遗憾的对象关系阻抗失配的根源之一。 codinghorror.com/blog/2006/06/…Hibernate 正在尝试为您管理此问题,但作为开发人员,您必须知道要使用哪种样式:docs.jboss.org/hibernate/orm/3.3/reference/en/html/…
猜你喜欢
  • 2018-01-01
  • 2012-07-21
  • 1970-01-01
  • 2015-12-27
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多