Я использую Microsoft.Office.Interop.Excel для чтения электронной таблицы, открытой в памяти.
gXlWs = (Microsoft.Office.Interop.Excel.Worksheet)gXlApp.ActiveWorkbook.ActiveSheet;
int NumCols = 7;
string[] Fields = new string[NumCols];
string input = null;
int NumRow = 2;
while (Convert.ToString(((Microsoft.Office.Interop.Excel.Range)gXlWs.Cells[NumRow, 1]).Value2) != null)
{
for (int c = 1; c <= NumCols; c++)
{
Fields[c-1] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)gXlWs.Cells[NumRow, c]).Value2);
}
NumRow++;
//Do my other processing
}
У меня 180 000 строк, и это оказывается очень медленно. Я не уверен, что «Конвертировать» эффективен. Есть ли в любом случае я мог бы сделать это быстрее?
Мун
-121--1406467-У меня есть два объекта, которые формируют отношение «родитель-потомок», которые имеют отношение «многие ко многим». Следуя рекомендациям справочного руководства Hibernate, я сопоставил это с помощью таблицы соединений:
<class name="Conference" table="conferences">
...
<set name="speakers" table="conference_speakers" cascade="all">
<key column="conference_id"/>
<many-to-many class="Speaker" column="speaker_id"/>
</set>
</class>
<class name="Speaker" table="speakers">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="firstName"/>
<property name="lastName"/>
</class>
Я желаю, чтобы один Спикер мог быть связан со многими различными Конференциями, но также чтобы любой Спикер, который больше не упоминается какой-либо Конференцией, был удален из таблицы Спикеров
(как Спикер без связанных конференций не имеет большого значения в моем проекте).
Однако я обнаружил, что если я использую cascade = «all-delete-orphan»
, то если Оратор, связанный с несколькими Конференциями, удаляется из только из одной из них , Hibernate пытается удалить сам экземпляр Динамика.
Ниже модульный тест, который показывает это поведение:
@Test
public void testRemoveSharedSpeaker() {
int initialCount = countRowsInTable("speakers");
Conference c1 = new Conference("c1");
Conference c2 = new Conference("c2");
Speaker s = new Speaker("John", "Doe");
c1.getSpeakers().add(s);
c2.getSpeakers().add(s);
conferenceDao.saveOrUpdate(c1);
conferenceDao.saveOrUpdate(c2);
flushHibernate();
assertEquals(initialCount + 1, countRowsInTable("speakers"));
assertEquals(2, countRowsInTable("conference_speakers"));
// the remove:
c1 = conferenceDao.get(c1.getId());
c1.getSpeakers().remove(s);
flushHibernate();
assertEquals("count should stay the same", initialCount + 1, countRowsInTable("speakers"));
assertEquals(1, countRowsInTable("conference_speakers"));
c1 = conferenceDao.get(c1.getId());
c2 = conferenceDao.get(c2.getId());
assertEquals(0, c1.getSpeakers().size());
assertEquals(1, c2.getSpeakers().size());
}
ошибка брошена, когда удаление s
от c1.speakers
обработан, потому что Зимуют, удаляет и ряд в столе соединения и эти спикеры
строка таблицы также:
ОТЛАДКА org.hibernate. SQL - удаляют из conference_speakers где conference_id =? и speaker_id=?
DEBUG org.ibernate.SQL - удаление из динамиков, где id =?
Если изменить значение cascade = «all-delete-orphan»
на cascade = «all»
, то этот тест будет работать так, как ожидалось, хотя и приведет к нежелательному поведению, когда в конечном итоге в таблице динамиков
окажутся потерянные строки.
Это заставляет меня задуматься - возможно ли для Hibernate знать, когда удалить осиротевшие объекты с дочерней стороны отношения, но только тогда, когда на ребенка не ссылаются другие родители (находятся ли эти родители в текущей сессии
)? Возможно, я неправильно использую cascade = «all-delete-orphan»
?
Я получаю такое же точное поведение, если я использую аннотации JPA вместо сопоставления XML, например:
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "conference_speakers",
joinColumns = @JoinColumn(name = "conference_id"),
inverseJoinColumns = @JoinColumn(name = "speaker_id"))
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Speaker> speakers = new HashSet<Speaker>();
Это с Hibernate 3,6,7 .Final, по пути.