Я пытался использовать фасет, но это не помогло. Я предоставляю код здесь, потому что он может вдохновить решение:
import altair as alt
import pandas as pd
df = pd.DataFrame({'label': ['A','A','B','B'],
'variable': ['x', 'y', 'x', 'y'],
'value':[2,4,3,1]})
bar = alt.Chart(df,title='My Plot').mark_bar().encode(
alt.Y('label', axis=alt.Axis(title='Label'),
sort=alt.EncodingSortField(field="value", op="values", order='descending')),
alt.X('value:Q', axis=alt.Axis(format='d', title='Value')),
tooltip=[alt.Tooltip('label', title='Label'),
alt.Tooltip('value:Q', format='d', title='Value'),]
).facet(
row='variable:O'
)
bar
Тем не менее порядок строк ['B', 'A'] для переменных x и y. Я надеялся получить ['A', 'B] для переменной y столбчатой диаграммы.
Дальнейшее развитие решения, предоставленного jakevdp, я получаю это:
selector = alt.selection_single(empty='all', fields=['label'])
base = alt.Chart(df, title='My Plot').mark_bar().encode(
alt.Y('label', axis=alt.Axis(title='Label'), sort=alt.EncodingSortField(field="value", op="sum", order='descending')),
alt.X('value:Q', axis=alt.Axis(format='d', title='Value')),
color=alt.condition(selector, alt.value('orange'), alt.value('lightgray')),
tooltip=[alt.Tooltip('label', title='Label'),
alt.Tooltip('value:Q', format='d', title='Value'),]
).add_selection(selector)
bar = alt.vconcat(title='My Chart')
for v in df['variable'].unique():
bar &= base.transform_filter(f"datum.variable == '{v}'").properties(title=f"'{v}'")
bar
В Spring транзакциях вы используете TransactionStatus.setRollbackOnly ()
.
Проблема в том, что вы используете @Transactional
для разграничения транзакций. Преимущество этого заключается в том, что он не является инвазивным, но это также означает, что если вы хотите вручную взаимодействовать с контекстом транзакции, вы не можете.
Если вам нужен жесткий контроль над статусом транзакции, вы должны использовать программные транзакции а не декларативные аннотации. Это означает использование Spring TransactionTemplate или напрямую его PlatformTransactionManager. См. Раздел 9.6 справочного руководства Spring.
С помощью TransactionTemplate
вы предоставляете объект обратного вызова, который реализует TransactionCallback
, и код в этом обратном вызове имеет доступ к объектам TransactionStatus
.
Это не так хорошо, как @Transactional
, но вы получаете более точный контроль над своим статусом передачи.
Вызов setRollbackOnly ()
в SessionContext
, если вы используете EJB.
Вы можете ввести SessionContext
примерно так:
public MyClass {
@Resource
private SessionContext sessionContext;
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.DEFAULT,
readOnly = false)
public int saveAll(){
//do stuff;
if(oops == true) {
sessionContext.setRollbackOnly();
return;
}
}
setRollbackOnly ()
является членом EJBContext
. SessionContext
расширяет EJBContext
:
http://java.sun.com/j2ee/1.4/docs/api/javax/ejb/SessionContext.html Обратите внимание, что он доступен только в сессионных EJB-компонентах.
@Resource
является стандартом Аннотация Java EE, поэтому вам, вероятно, следует проверить свою настройку в Eclipse. Вот пример того, как внедрить SessionContext, используя @Resource
.
Я подозреваю, что это, вероятно, не ваше решение, поскольку кажется, что вы не работаете с EJB - - объяснение, почему Eclipse не находит @Resource
.
В этом случае вам нужно будет взаимодействовать с транзакцией напрямую - см. шаблон транзакции.
У вас должен быть Spring для инъекции диспетчера транзакций. Затем вы можете просто вызвать для него метод отката.
Вызовите исключение и используйте структуру, как задумано, в противном случае не используйте декларативное управление транзакциями и следуйте советам skaffman выше. Будьте проще.