实体类总是需要ID吗?

时间:2012-11-14 05:47:27

标签: java database hibernate entity

好吧,我想知道我们是否总是需要在实体类中有一个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>

现在,扩展用户的患者和SpiProfessional拥有他们唯一的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解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

定义您对实体的理解可能会有所帮助。如果您正在考虑“只是一个带有数据库后端的对象”,那么您无法全面了解。

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

方面做得非常出色
  

“”主要由其身份定义的对象称为ENTITY。   [Evans 2003]“

     

ENTITY是指在生命周期中具有连续性的任何东西   区别独立于重要的属性   应用程序的用户。 [Evans 2003]

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

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