Проблема отображения Hibernate с составным идентификатором - PullRequest
0 голосов
/ 14 апреля 2010

Я использую hibernate3 в своем java-приложении для доступа к серверу sqlserver 2008. Отображение hibernate использует составной идентификатор, и когда я пытаюсь загрузить модель, он возвращает ноль. Я потратил несколько дней, чтобы решить эту проблему, но все равно ничего не получилось. Составное сопоставление идентификаторов должно использоваться для PK с несколькими полями, но в моей таблице нет такого PK, мне интересно, почему JBoss Hibernate Tool (плагин eclipse) сгенерировал его с составным сопоставлением идентификаторов?

Буду признателен за любую помощь или комментарии.

Спящие модели:

public class AuthorLoginTrack implements java.io.Serializable {

private AuthorLoginTrackId id;

public AuthorLoginTrack() {
}

public AuthorLoginTrack(AuthorLoginTrackId id) {
    this.id = id;
}

public AuthorLoginTrackId getId() {
    return this.id;
}

public void setId(AuthorLoginTrackId id) {
    this.id = id;
}

}

public class AuthorLoginTrackId implements java.io.Serializable {

private long id;
private String userId;
private Date dateCreated;

public AuthorLoginTrackId() {
}

public AuthorLoginTrackId(long id, String userId) {
    this.id = id;
    this.userId = userId;
}

public AuthorLoginTrackId(long id, String userId, Date dateCreated) {
    this.id = id;
    this.userId = userId;
    this.dateCreated = dateCreated;
}

public long getId() {
    return this.id;
}

public void setId(long id) {
    this.id = id;
}

public String getUserId() {
    return this.userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

public Date getDateCreated() {
    return this.dateCreated;
}

public void setDateCreated(Date dateCreated) {
    this.dateCreated = dateCreated;
}

public boolean equals(Object other) {
    if ((this == other))
        return true;
    if ((other == null))
        return false;
    if (!(other instanceof AuthorLoginTrackId))
        return false;
    AuthorLoginTrackId castOther = (AuthorLoginTrackId) other;

    return (this.getId() == castOther.getId())
            && ((this.getUserId() == castOther.getUserId()) || (this
                    .getUserId() != null
                    && castOther.getUserId() != null && this.getUserId()
                    .equals(castOther.getUserId())))
            && ((this.getDateCreated() == castOther.getDateCreated()) || (this
                    .getDateCreated() != null
                    && castOther.getDateCreated() != null && this
                    .getDateCreated().equals(castOther.getDateCreated())));
}

public int hashCode() {
    int result = 17;

    result = 37 * result + (int) this.getId();
    result = 37 * result
            + (getUserId() == null ? 0 : this.getUserId().hashCode());
    result = 37
            * result
            + (getDateCreated() == null ? 0 : this.getDateCreated()
                    .hashCode());
    return result;
}

}

Отображение Hibernate:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Apr 6, 2010 4:17:46 PM by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.entity.model.AuthorLoginTrack" table="AuthorLoginTrack" schema="dbo" catalog="tribetoyota_db">
        <composite-id name="id" class="com.entity.model.AuthorLoginTrackId">
            <key-property name="id" type="long">
                <column name="ID" precision="18" scale="0" />
            </key-property>
            <key-property name="userId" type="string">
                <column name="UserID" length="20" />
            </key-property>
            <key-property name="dateCreated" type="timestamp">
                <column name="DateCreated" length="16" />
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>

Таблица Dump:

/****** Object:  Table [dbo].[AuthorLoginTrack]    Script Date: 04/14/2010 20:43:02 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[AuthorLoginTrack](
    [ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [UserID] [varchar](20) NOT NULL,
    [DateCreated] [smalldatetime] NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[AuthorLoginTrack] ADD  CONSTRAINT [DF_AuthorLoginTrack_DateCreated]  DEFAULT (getdate()) FOR [DateCreated]
GO

Таблица:

ID  UserID   DateCreated
------------------------------------
5   cooler   2005-03-17 18:56:00
6   miumiu   2005-03-17 19:46:00

Код DAO:

AuthorLoginTrack track;
AuthorLoginTrackId trackId; 

trackId = new AuthorLoginTrackId();
trackId.setId(5);

track = (AuthorLoginTrack)getSession().load(AuthorLoginTrack.class, trackId);
return track.getId().getUserId(); // returns null why ?:((

1 Ответ

0 голосов
/ 14 апреля 2010

Session.load (...) предполагает, что действительно существует экземпляр с заданным идентификатором, в большинстве случаев он возвращает прокси-объект без попадания в базу данных. На самом деле вы запрашиваете экземпляр с идентификатором 5, userId = null и date == null.

По сути, вы получаете унифицированный прокси с копией составного идентификатора, который вы использовали для запроса. Если экземпляр действительно существует, у вас все будет в порядке, иначе вы получите исключение ObjectNotFoundException при первом использовании объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...