java - 实体类总是需要 ID 吗?

标签 java database hibernate entity

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

就我而言,我有这样的类(class):

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>

现在,扩展用户的 Patient 和 SpiProfessional 都有自己唯一的 ID,这也有点愚蠢,这些 ID 也只在数据库中可见。

到目前为止,我还没有设法通过 hibernate 来保存 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 来解决这个问题吗?

最佳答案

它可能有助于定义您对实体的理解。如果您想到的是“只是一个带有数据库后端的对象”,那么您并没有了解全貌。

埃里克·埃文斯 (Eric Evans) 出色地定义了 Entity in Domain Driven Design如:

"“An object defined primarily by its identity is called an ENTITY.” [Evans 2003]"

An ENTITY is anything that has continuity through a life cycle and distinctions independent of attributes that are important to the application’s user. [Evans 2003]

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

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

关于java - 实体类总是需要 ID 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373655/

相关文章:

java - 从父类获取字符串到子类的概念?

php - 如何检查数据库中的重复条目?

sql-server - 对现有更新的 SQL Server

java - Hibernate: ORA-01756: 带引号的字符串未正确终止

java - 谷歌应用引擎 java 上的 HttpOnly cookie

java - 关闭 CloseableHttpClient 将释放哪些资源?

java - 在查询的任何表中都找不到列 (XIT115)(或 SLV 未定义)

java - 如何在使用 JTA 实体管理器时插入一些数据

java - 如何获取出现次数最多的对象集?

java - 使 ImageView 在设定的时间内可见