Hibernate: Невозможно найти сущность, которая явно существует, почему бы и нет? - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть класс сущностей, который используется для моделирования метеостанции, и он включает уникальное строковое свойство «код».У меня также есть класс сущностей, который используется для того, чтобы содержать среднесуточные значения для различных наблюдений, и этот среднесуточный класс сущностей имеет многозначную связь с классом сущностей станции, т.е. каждый среднесуточный объект связан со станцией:

@Entity(name = EsrlDailyAvg.TABLE_NAME)
@Table(name = EsrlDailyAvg.TABLE_NAME, 
       uniqueConstraints = { @UniqueConstraint(columnNames = { EsrlDailyAvg.STATION_COLUMN_NAME,
                                                               EsrlDailyAvg.DATE_COLUMN_NAME }) })
public final class EsrlDailyAvg
    extends AbstractPersistentEntity<Long>
{
    public static final String TABLE_NAME = "ESRL_DAILY_AVG";
    public static final String STATION_COLUMN_NAME = "ESRL_STATION_ID";
    public static final String DATE_COLUMN_NAME = "ESRL_DATE";
    private EsrlStation station;
    private Date date;
    // additional properties used to contain average values

    @Column(name = DATE_COLUMN_NAME, nullable = false)
    public Date getDate()
    {
        return date;
    }

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name = STATION_COLUMN_NAME)
    public EsrlStation getStation()
    {
        return station;
    }

    ....
}


@Entity(name = EsrlStation.TABLE_NAME)
public class EsrlStation
    extends AbstractPersistentEntity<Long>
{
    public static final String TABLE_NAME = "ESRL_STATION";
    private EsrlStationCodeEnum code;

    @Column(name = "CODE", nullable = false, unique = true)
    @Enumerated(EnumType.STRING)
    public EsrlStationCodeEnum getCode()
    {
        return code;
    }

    ...
}

Класс DAO для среднесуточных объектов содержит метод поиска уникальной среднесуточной сущности по коду станции и дате:

public EsrlDailyAvg findByStationCodeDate(final String stationCode,
                                          final Date date)
{
    String hql = "from " + getCanonicalPersistentClassName() + " dailyAvg where dailyAvg.station.code = '" +
                 stationCode + "' and dailyAvg.date = :date";
    return (EsrlDailyAvg) getCurrentSession().createQuery(hql).setParameter("date", date).uniqueResult();
}

Я написал тесты, которые сохраняют, а затем успешно находят ежедневноСредние объекты по коду станции и дате, поэтому я предполагаю, что приведенный выше код DAO работает, как ожидалось.Однако, когда я запускаю отдельную программу, которая использует этот метод DAO, я не могу успешно найти объект среднесуточной сущности, который, как мне известно, присутствует (я могу запросить базу данных с помощью SQL и посмотреть запись).

IЯ не уверен, что это уместно, но я запускаю свои тесты, используя базу данных HSQL в памяти, и я запускаю отдельную программу, используя базу данных Oracle.

Я отладил код и код станциии параметры даты передаются, как и ожидалось, в метод DAO.

Может кто-нибудь прокомментировать, почему это происходит, или предложить, где я должен искать ошибку?Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 23 февраля 2011

Оказывается, ошибка была связана с тем, как я создавал параметр даты, который передавался рассматриваемому методу DAO.Сначала я создавал объект GregorianCalendar, чтобы установить год, месяц и день, но я не стал устанавливать значение поля в миллисекундах на ноль.После этого значение Date, которое я использовал в качестве параметра метода DAO (myCalendar.getTime ()), соответствует значению даты в базе данных, и метод DAO находит запись, как ожидается.

Уроквыучен: при получении даты из календаря обязательно установите все поля календаря (не используйте нулевые значения для неустановленных полей календаря).

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