Spring Boot 1.4 Hibernate 5 konfiguracja

Spring Boot 1.4 Hibernate 5 konfiguracja
E1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0

Witam, mam problem z podpięciem hibernate 5 do spring boota 1.4. Wszystko robie bez pliku persistence.xml w Gradle. Próbowałem już na różne sposoby, niestety w internecie są stare rozwiązania, albo źle szukam :D W tym przypadku dostaję NullPointerException

build.gradle (tylko dependencies)

Kopiuj
dependencies {
	compile('org.springframework.boot:spring-boot-starter-actuator')
	compile('org.springframework.boot:spring-boot-starter-aop')
	compile('org.springframework.boot:spring-boot-starter-web')
	compile('org.springframework.boot:spring-boot-starter-web-services')
	compile "org.jsoup:jsoup:1.9.2"

	compile group: 'postgresql', name: 'postgresql', version: '9.1-901-1.jdbc4'


	compile group: 'org.hsqldb', name: 'hsqldb', version: '2.3.1'
	compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.2.Final'
	
	
	
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

application.properties

Kopiuj
spring.datasource.url=jdbc:postgresql://localhost:5432/ernest
spring.datasource.username=postgres
spring.datasource.password=psql
spring.datasource.driver-class-name=org.postgresql.Driver;

spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

UserDao (tu mam NullPointerException w entityManager.persist(user);

Kopiuj
import javax.persistence.EntityManager;
import javax.persistence.PersistenceUnit;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {

	@PersistenceUnit
	private EntityManager entityManager;
	
	public void saveUser(){
		User user = new User();
		user.setLogin("ernest");
		user.setPassword("pass");
		
		entityManager.persist(user);
	}
}

w klasie mainowej mam tylko adnotacje @SpringBootApplication

edytowany 2x, ostatnio: ernest1
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A klasa ze springowym kontekstem tzn klasa z @Configuration gdzie miałbyś zdefiniowaną konfiguracje dla jakiegoś beana, pewnie org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean i dla transaction managera i jeszcze ustawić annotation driven transaction?
Ja mam wrażenie że ludzie nie powinni zaczynać od Spring Boota bo potem niektórym się wydaje że to wszystko jakoś samo z siebie działa :D (co zresztą pewnie by się stało jakby napchać jeszcze jakis spring boot starter jpa znając życie...)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
BR
A czy właśnie nie jest dobrze zaczynać swoją przygodę ze Spring Boot'em? Tak żeby dobrze zrozumieć podstawy z czym to się je, a dopiero próbować ze zwykłym Springiem?
Shalom
Moim zdaniem wręcz przeciwnie. Bo Boot niczego cię nie nauczy. Tam albo wszystko sie dzieje samo i działa od razu bo zaklepali tam "gotowca", albo nie działa i nie będziesz rozumiał ani gdzie ani jak dodać tą funkcjonalność (tak jak kolega @ernest1 )
E1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0
Shalom napisał(a):

to wszystko jakoś samo z siebie działa

no to chyba jest głównym celem Spring Boota, jak nie całego frameworka

i w Spring MVC właśnie nie ma takiego problemu z konfiguracją bo są tysiące gotowych rozwiązań jak to zrobić. Jeśli ktoś znałby rozwiązanie to proszę o odpowiedź, chociaż zabieram się do jej znalezienia :)

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Wydaje mi się że musisz to zrobić tak jak napisałem, tzn konfiguracje przeprowadzić ręcznie. Tutaj nie ma nic do "znajdowania", musisz po prostu zdefiniować sobie 2 beany w konfiguracji. Mam tylko nadzieje że w CV nie wpisujesz sobie znajomości Springa, bo zabijesz kogoś ze śmiechu na interview ;)
Jest gotowa konfiguracja boota dla jpa ale tylko dla Spring Data a nie dla ręcznie pisanego DAO.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
E1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0
Kopiuj
@Configuration
@EnableTransactionManagement
public class Konf {

	@Bean
	public JpaTransactionManager jpaTransMan(){
		JpaTransactionManager jtManager = new JpaTransactionManager(getEntityManagerFactoryBean().getObject());
		return jtManager;
	}
	@Bean
	public LocalEntityManagerFactoryBean getEntityManagerFactoryBean() {
		LocalEntityManagerFactoryBean lemfb = new LocalEntityManagerFactoryBean();
		lemfb.setPersistenceUnitName("localEntity");
		return lemfb;
	}
}
Kopiuj
@Repository
@Transactional(readOnly = false)
public class UserDao {

	@PersistenceUnit
	private EntityManager entityManager;
	
	public void saveUser(){
		User user = new User();
		user.setLogin("ernest");
		user.setPassword("pass");
				
		entityManager.persist(user);
	}
}

dla takiej konfiguracji i przy próbowaniu @Autowired UserDao dostaję taki Exception i w sumie to cały czas miałem chyba taki Exception, ale do tematu wolałem wrzucić mniej skomplikowany kod. Czasami serio uważam, że niektóre konfiguracje były łatwiejsze w MVC niż Boocie

Kopiuj
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loggingController': Unsatisfied dependency expressed through field 'userDao': Error creating bean with name 'userDao' defined in file [/home/user/bin/pl/pvkk/profit/user/UserDao.class]: Post-processing failed of bean type [class pl.profit.user.UserDao] failed; nested exception is java.lang.IllegalStateException: Specified field type [interface javax.persistence.EntityManager] is incompatible with resource type [javax.persistence.EntityManagerFactory]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in file [/home/user/bin/pl/profit/user/UserDao.class]: Post-processing failed of bean type [class pl.profit.user.UserDao] failed; nested exception is java.lang.IllegalStateException: Specified field type [interface javax.persistence.EntityManager] is incompatible with resource type [javax.persistence.EntityManagerFactory]
edytowany 1x, ostatnio: ernest1
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A widzisz teraz to zupełnie co innego. Pomyliłeś adnotacje. Chciałeś użyć @PersistenceContext a nie @PersistenceUnit


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
E1
to samo, ale chyba jestem coraz bliżej (No Persistence provider for EntityManager named localEntity)
Shalom
A bo nie skonfigurowałeś go :D Zrobiłeś gołego beana i myślisz ze on sam się domyśli że ma śmigać pod hibernatem? :D :D :D
E1
jak robie to samo z EntityManagerFactory to mam to samo, a chyba w tej konfiguracji spring już powinien go tworzyć
Shalom
Nie bardzo rozumiem o co ci chodzi. Skonfiguruj to jak człowiek a nie licz ze się cudownie samo ziści :D Popatrz tutaj: https://github.com/Pharisaeus/SpringScaffoldApplication/blob/master/src/main/webapp/WEB-INF/spring-context.xml ile rzeczy ustawia się dla entity manager factory.
E1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0

Proszę o przywrócenie do porządku Pana Moderatora i nie spamowaniu tematu głupimi i bezwartościowymi postami. Pozdrawiam.

E1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0

Dochodzi 2 w nocy, a ja właśnie poradziłem sobie z problemem :D Wbrew "poradom" moderatora nie dodawałem żadnych beanów z konfiguracją, dodałem tylko plik hibernate.cfg.xml, gdzie umieściłem jedynie to samo co w application.properties.

A co do moderatora w tym temacie nie potrafił napisać nic mądrego, dawał rady bez większego wytłumaczenia : D : D : D : D postował swoje głupie emotki : D : D I

mam tylko nadzieje że w CV nie wpisujesz sobie znajomości Springa, bo zabijesz kogoś ze śmiechu na interview ;)

edytowany 2x, ostatnio: ernest1
insectoman
a nie mogłeś wyciągnąć properties z application.properties, tylko niepotrzebnie tworzyłeś dodatkowy plik?
E1
próbowałem, ale hibernate domaga się swojego pliku
TR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:731
0

urągające...
przy takiej przykrej okazji, mam propozycję do moderatorów/adminów, żeby zrobić "poddział" Spring, ale zasadą (warunkiem koniecznym), żeby wklejać strukturę Springowego projektu...

@ernest1: jak można besztać faceta, który chciał Ci pomóc? Oczywiście nie wiedział dokładnie jak, bo poruszał się po omacku.
Naprawdę, wystarczyło napisać: "Dziękuję, jednak mój problem był w innym miejscu".


musica curat corpus at animam
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Dochodzi 2 w nocy, a ja właśnie poradziłem sobie z problemem Wbrew "poradom" moderatora nie dodawałem żadnych beanów z konfiguracją, dodałem tylko plik hibernate.cfg.xml, gdzie umieściłem jedynie to samo co w application.properties.

@ernest1 no i widać znów że nie rozumiesz co się dzieje w twoim projekcie. Nowe beany można definiować na wiele sposobów, założyłem że skoro juz uzywasz Spring Boot to chcesz mieć Java Configuration, ale to nie jest jedyna metoda. Równie dobrze można definiować beany w xmlowym springowym kontekście, a także na kilka innych sposobów, w tym ten którego użyłeś. Gdybyś poprawnie zastosował się do mojej rady to także by zadziałało, tak samo gdybyś zdefiniował te beany w xmlowym kontekście, bo wszystkie te metody są równoważne. Wiedziałbyś o tym gdybyś postanowił kiedyś naczyć się programować inaczej niż metodą kopiuj-wklej ze stackoverflow :) Więc zaręczam ci że dodałeś właśnie bean z konfiguracją - dodałeś go za pomocą xmla, tylko że nawet o tym nie wiesz, bo programujesz metodą kopiego pejsta...

To jak podpiąłeś hibernate jest metodą najgorszą z możliwych i działa tylko dlatego że twórcy springa przewidzieli, że ktoś bez cienia zrozumienia będzie chciał coś takiego wykonać. Wrzuciłeś plik konfiguracji gołego hibernate a używasz go jako dostawce JPA. Jeszcze nie tak dawno po prostu by to nie zadziałało, ale widać twórcy springa zlitowali się nad sierotkami kopiującymi niezrozumiałe kawałki kodu z tutoriali sprzed kilku lat i zwyczajnie naprawiają twój błąd automatycznie. Jeśli już chciałeś dodawać plik xml to należało dostać persistence.xml skoro używasz JPA. Niemniej jest to raczej niezbyt eleganckie rozwiązanie skoro juz i tak korzystasz z Boota. Chciałbym zobaczyć jak teraz wymieniasz dostawcę JPA z Hibernate na jakiegoś innego. W normalnym projekcie to jedna linijka do zmiany.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
E1
nie, nie konfiguruję żadnego z wyżej wymienionych beanów, a twórcy springa ułatwiają życie programistom, a nie litują się nad sierotkami, no ale myśl jak wolisz.
Shalom
No jak to nie? Przecież wrzuciłeś konfiguracje hibernate do xmla, co NICZYM nie różni sie od zdefiniowania sobie @Bean w którym ustawiałbyś pola na te wartości. Wiedziałbyś to gdybyś rozumiał jak to działa i co sie dzieje "pod spodem", bo tam zadnej magii nie ma.
0

Tu masz przykład projektu na GitHub z wykorzystaniem Spring Boot i Hibernate: https://github.com/netgloo/spring-boot-samples/tree/master/spring-boot-mysql-hibernate

Zwróć uwagę na plik DatabaseConfig.java i bedziesz wszystko wiedział.

E1
tu jest używany hibernate 4, piatka nie posiada niektorych klas z tej konfiguracji
Shalom
Przecież to mu właśnie zaleciłem kilka postów wyżej i stwierdził ze spamuje głupimi i bezwartościowymi postami ;]
E1
no daj jeszcze spring-context.xml i persistence.xml ułatwi mi to że ho ho
Shalom
@ernest1 a czemu miałoby nie ułatwić? Konfiguracje zwykle robi sie jednolicie, albo tak albo siak, ale ona wygląda tak samo. Co za różnica czy masz spring-context.xml czy masz klasę z @Configuration? Przecież będą zawierać dokładnie to samo! Ale znów, żeby o tym wiedzieć musiałybś rozumieć po co te pliki są i co Spring z nimi robi. A tego niestety z kopiuj-wklej trudno się nauczyć.
E1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0

to mój plik hibernate.cfg.xml

Kopiuj
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

        <!-- Connection settings -->
		<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
		<property name="hibernate.connection.url">jdbc:hsqldb:data/tutorial</property>
        
        
        <property name="hibernate.connection.username">postgres</property>
        <property name="hibernate.connection.password">pass</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>

        <!-- Print executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create all database on startup -->
        <property name="hibernate.hbm2ddl.auto">create-drop</property>

        <!-- Annotated entity classes -->
        <mapping class="pl.profit.user.User"/>
        
    </session-factory>
</hibernate-configuration>
Shalom
Ładnie, wyżej chwalisz się ze Hibernate 5, a tu config z DTD do 3.0 (no bo w końcu nikt powyżej tej wersji nie konfiguruje hibernate w ten sposób). Gotowca/tutorial z tym konfigiem znalazłeś przez webarchive? Wcześniej chciałeś postgresa używać no ale skoro gotowiec ma hslq to lepiej nie ruszać bo sie popsuje :D Idę po popcorn chyba...
E1
chyba lepiej testować na hsql niz postgresie. Nie?
E1
on myśli że liczba 3.0 oznacza wersje hibernate xD hahahahha leże :D
Shalom
@ernest1 ? nie do końca rozumiem żart, bo jak najbardziej wersja 3.0 oznacza wersje konfiguracj którą deklarujesz że używasz i według tejże wersji walidowana jest ta xmlowa konfiguracja. Gdybyś użył tu czegoś wprowadzonego w wersji 4.x to walidacja xmla by się nie powiodła. Więc nadal uważam że jedyna śmieszna rzecz to fakt że chwalisz się hibernatem 5 a sam utrudniasz sobie używanie funkcjonalności z wersji powyżej 3 ;]
E1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:10
0

aaaaa w końcu to działa, a najlepsze były niedziałające tutoriale z internetu robione metodą ctrl+c, ctrl+v. sorry panie moderatorze ale byłem zdenerwowany

Plik konfiguracyjny

Kopiuj
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
public class HibernateConfig {

	@Bean
	public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
	    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
	    em.setDataSource(dataSource());
	    em.setPackagesToScan(new String[] { "pl.pvkk.profit" });
	    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
	    em.setJpaVendorAdapter(vendorAdapter);
	    em.setJpaProperties(additionalProperties());
	    return em;
	}

	Properties additionalProperties() {
	    Properties properties = new Properties();
	    properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
	    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
	    properties.setProperty("hibernate.show_sql", "true");
	    return properties;
	}
	
	@Bean
	public DataSource dataSource() {
	    DriverManagerDataSource dataSource = new DriverManagerDataSource();
	    dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
	    dataSource.setUrl("jdbc:hsqldb:data/tutorial");
	    dataSource.setUsername("postgres");
	    dataSource.setPassword("pass");
	    return dataSource;
	}
	
	@Bean
	public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
	    JpaTransactionManager transactionManager = new JpaTransactionManager();
	    transactionManager.setEntityManagerFactory(emf);
	    return transactionManager;
	}
}

gradle dependencies

Kopiuj
 compile group: 'org.hsqldb', name: 'hsqldb', version: '2.3.2'
	
	compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.2.Final'
	compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.2.2.Final'
	compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.4.0.RELEASE'

a w naszy repozytorium tworzymy entity managera jak poniżej

Kopiuj
	@Autowired
	private EntityManagerFactory emf;
	
	public String getUser(){
		EntityManager em = emf.createEntityManager();
		
		em.getTransaction().begin();
		User user = em.find(User.class, 1);
		em.getTransaction().commit();		
		return user.toString();
	}
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Zalecałbym jednak wstrzykiwać @PersistenceContext i EntityManager a także używać @Transactional zamiast ręcznego otwierania i zamykania transakcji. To drugie będzie wymagać dodania @EnableTransactionManagement. Będzie wygodniej i ładniej.
No i lepiej użyć @Inject zamiast @Autowired żeby niepotrzebnie nie wiązać sie tak mocno z frameworkiem.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Interpod
Dane do bazy trzymac .properties i wczytywać za pomocą @PropertySource czy jest jakaś lepsza alternatywa?
Shalom
@Interpod tak najwygodniej i raczej nie ma alternatywy specjalnie.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)