Чтобы иметь доступ к ним из ваших статических методов, они должны быть статическими переменными-членами, например:
public class MyProgram7 {
static Scanner scan = new Scanner(System.in);
static int compareCount = 0;
static int low = 0;
static int high = 0;
static int mid = 0;
static int key = 0;
static Scanner temp;
static int[]list;
static String menu, outputString;
static int option = 1;
static boolean found = false;
public static void main (String[]args) throws IOException {
...
Это старый вопрос, но у меня была аналогичная проблема, и я решил добавить к этой теме. Мне нужно было добавить журнал к существующему журналу журнала аудита StatelessSession. Существующая реализация использовала StatelessSession, поскольку поведение кэширования стандартной реализации сеанса было ненужным накладными расходами и , и мы не хотели, чтобы наши слушатели спящего режима запускали запись журнала аудита. Эта реализация заключалась в достижении максимальной производительности записи без каких-либо взаимодействий.
Однако для нового типа журнала необходимо использовать тип поведения insert-else-update, где мы намерены обновлять существующие записи журнала с временем транзакции в качестве типа «пометки». В StatelessSession saveOrUpdate () не предлагается, поэтому нам нужно было выполнить обновление insert-else вручную.
В свете этих требований:
Вы можете использовать поведение mysql «insert ... on duplicate key update» через пользовательскую sql-insert для постоянный объект спящего режима. Вы можете определить произвольное предложение sql-insert либо через аннотацию (как в приведенном выше ответе), либо через объект sql-insert, сопоставление hibernate xml, например:
<class name="SearchAuditLog" table="search_audit_log" persister="com.marin.msdb.vo.SearchAuditLog$UpsertEntityPersister">
<composite-id name="LogKey" class="SearchAuditLog$LogKey">
<key-property
name="clientId"
column="client_id"
type="long"
/>
<key-property
name="objectType"
column="object_type"
type="int"
/>
<key-property
name="objectId"
column="object_id"
/>
</composite-id>
<property
name="transactionTime"
column="transaction_time"
type="timestamp"
not-null="true"
/>
<!-- the ordering of the properties is intentional and explicit in the upsert sql below -->
<sql-insert><![CDATA[
insert into search_audit_log (transaction_time, client_id, object_type, object_id)
values (?,?,?,?) ON DUPLICATE KEY UPDATE transaction_time=now()
]]>
</sql-insert>
Оригинальный плакат спрашивает о MySQL конкретно , Когда я реализовал поведение insert-else-update с помощью mysql, я получал исключения, когда «путь обновления» sql был выведен. В частности, mysql сообщал, что 2 строки были изменены, когда обновлялась только одна строка (якобы из-за того, что существующая строка является удаленной, а новая строка вставлена). См. эту проблему для более подробной информации об этой конкретной функции.
Итак, когда обновление возвратило 2x количество строк, затронутых в спящий режим, hibernate выбрасывал исключение BatchedTooManyRowsAffectedException, откат транзакции , и пропагандировать исключение. Даже если вы должны поймать исключение и обработать его, транзакция уже была отклонена этим пунктом.
После некоторого копания я обнаружил, что это проблема с сущностью, которую использует спящий режим. В моем случае hibernate использовал SingleTableEntityPersister, который определяет Ожидание, что количество обновленных строк должно соответствовать количеству строк, определенных в пакетной операции.
Окончательная настройка, необходимая для работы этого поведения, заключалась в определении пользовательский persister (как показано в приведенном выше сопоставлении xml). В этом случае все, что нам нужно было сделать, это расширить SingleTableEntityPersister и «переопределить» вставку Expectation. Например. Я просто применил этот статический класс к объекту persistence и определил его как пользовательский persister в сопоставлении спящего режима:
public static class UpsertEntityPersister extends SingleTableEntityPersister {
public UpsertEntityPersister(PersistentClass arg0, EntityRegionAccessStrategy arg1, SessionFactoryImplementor arg2, Mapping arg3) throws HibernateException {
super(arg0, arg1, arg2, arg3);
this.insertResultCheckStyles[0] = ExecuteUpdateResultCheckStyle.NONE;
}
}
Чтобы найти это, потребовалось довольно много времени, пробираясь через спящий код, - я не смог найти любые темы в сети с решением этого.
Вы просмотрели аннотацию Hibernate @SQLInsert ?
@Entity
@Table(name="story_count")
@SQLInsert(sql="INSERT INTO story_count(id, view_count) VALUES (?, ?)
ON DUPLICATE KEY UPDATE view_count = view_count + 1" )
public class StoryCount
Если вы используете Grails, я нашел это решение, которое не требовало переноса вашего класса Domain в мир JAVA и использование аннотаций @SQLInsert:
Например, если у вас есть домен объект, называемый Person, и вы хотите, чтобы INSERTS были INSERT ON DUPLICATE KEY UPDATE, вы создали бы такую конфигурацию:
public class MyCustomConfiguration extends GrailsAnnotationConfiguration {
public MyCustomConfiguration() {
super();
classes = new HashMap<String, PersistentClass>() {
@Override
public PersistentClass put(String key, PersistentClass value) {
if (Person.class.getName().equalsIgnoreCase(key)) {
value.setCustomSQLInsert("insert into person (version, created_by_id, date_created, last_updated, name) values (?, ?, ?, ?, ?) on duplicate key update id=LAST_INSERT_ID(id)", true, ExecuteUpdateResultCheckStyle.COUNT);
}
return super.put(key, value);
}
};
}
и добавили это как конфигурацию Hibernate в DataSource.groovy:
dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
configClass = 'MyCustomConfiguration'
}
Просто обратите внимание на использование LAST_INSERT_ID, так как это НЕ будет установлено правильно, если UPDATE будет выполнен вместо INSERT, если вы не установите его явно в инструкции, например ID = LAST_INSERT_ID (ID). Я не проверял, где GORM получает идентификатор, но я предполагаю, что он использует LAST_INSERT_ID.
Надеюсь, что это поможет.
<sql-insert check="none">...
или@SQLInsert(sql="...", check="none")
– Shannon 29 March 2014 в 00:46@SQLInsert(sql="...", check=ResultCheckStyle.NONE)
– Shannon 29 March 2014 в 01:37