Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Polish

Wstęp

Mechanizm wtyczek dostarcza narzędzi, które umożliwiają wtyczkom korzystanie z bazy danych. Zalecanym sposobem jest używanie biblioteki Hibernate.

Wtyczka może uzyskać dostęp do jakiejkolwiek bazy danych, jednak w tym rozdziale opisana zostanie tylko obsługa systemowej bazy danych.

Konfiguracja obiektów

W rozdziale Konfiguracja kontekstu wtyczki

opisane

 opisane zostało, w jaki sposób dodawać beany do kontekstu. Obsługa bazy danych bazować będzie na integracji SpringFramework i Hibernate. Opisana zostanie konfiguracja XML.

Aby zarejestrować SessionFactory

wystarczy

 wystarczy dodać taką deklarację bean'a. Obiekt automatycznie konfiguruje używany dialect, datasource etc.

Code Block
languagehtml/xml
titleplugin-context.xml
<bean id="sessionFactory" class="com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean">
	<property name="packagesToScan" value="com.suncode.plugin.tutorial" />
</bean>
Info

Klasa com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean bazuje na klasie LocalSessionFactoryBean. Tam również znajduje się dokumentacja.

 

Prawdopodobnie chcemy także wykorzystać inne mechanizmy, które upraszczają kod transakcyjny:

Code Block
languagehtml/xml
titleplugin-context.xml
<!-- adnotacje @Transactional -->
<tx:annotation-driven/>
 
<!-- TransactionManager -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>

Przykład działania

Teraz należy stworzyć naszą encję:

Code Block
languagejava
titleNote
@Entity
@Table(name = "pm_tutorial_note")
@SequenceGenerator(name = "note", sequenceName = "pm_tutorial_note_id")
public class Note {
 
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "note")
	private Long id;
 
	@Column(length = 2000)
	private String text;
 
	// getters...
	// setters...
}
Note

Nazwy tabel, kolumn i sequencerów nie powinny przekraczać 30 znaków (limit Oracle)

 

Zapis i odczyt naszego obiektu może wyglądać tak:

Code Block
languagejava
titleNoteService
@Service
@Transactional
public class NoteService {
 
	@Autowired
	private SessionFactory sessionFactory;
 
	public void saveNote(Note note){
		sessionFactory.getCurrentSession().save(note);
	}
 
	public Note getNote(Long id){
		return (Note) sessionFactory.getCurrentSession().get(Note.class, id);
	}
}
Tip

Jakiekolwiek zmiany dokonane we wtyczce nie wymagają restartu serwera. Nawet zmiany mappingu hibernate są widoczne po aktualizacji wtyczki.

Wykorzystanie w mappingu systemowych encji

Może się zdarzyć, że w naszej encji potrzebujemy mapping np. na użytkownika systemu. W takim wypadku musimy zaimportować mapping użytkownika, żeby nasza instancja SessionFactory miała wszystkie potrzebne do zapisu w bazie danych informacje.

Import mappingów z systemu odbywa się podczas konfiguracji SessionFactory Hibernate'a:

Code Block
languagehtml/xml
titleplugin-context.xml
<bean id="sessionFactory" class="com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean">
	<property name="packagesToScan" value="com.suncode.plugin.tutorial" />
	
	<!-- Musimy zaimportować całe drzewo zależności -->
	<property name="importedMappings">
		<array>
			<value>com.suncode.pwfl.administration.user.User</value>
			<value>com.suncode.pwfl.administration.user.UserGroup</value>
			<value>com.suncode.pwfl.administration.structure.Position</value>
			<value>com.suncode.pwfl.administration.structure.OrganizationalUnit</value>
			<value>com.suncode.pwfl.administration.structure.Role</value>
		</array>
	</property>
</bean>
Note

Aktualnie musimy samodzielnie wypisać wszystkie zależności, nawet te przejściowe. Jeżeli chcemy zaimportować tylko użytkownika, musimy zaimportować jeszcze 4 inne mappingi jak pokazano powyżej.

Planowane jest poprawienie sposobu importu mappingów.

 

Nasza zaktualizowana encja:

Code Block
languagejava
titleNote
@Entity
@Table(name = "pm_tutorial_note")
@SequenceGenerator(name = "note", sequenceName = "pm_tutorial_note_id")
public class Note {
 
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "note")
	private Long id;
 
	@Column(length = 2000)
	private String text;
	
	@ManyToOne
    @JoinColumn(name = "user_id")
    @OnDelete(action = OnDeleteAction.CASCADE)
	private User user;
 
	// getters...
	// setters...
}
Tip

Dodanie obiektu użytkownika do naszej encji zaowocuje dodaniem klucza obcego w schemacie bazy danych. Niestety w takim wypadku nie będzie możliwe usunięcie użytkownika z systemu, dopóki nie zostaną usunięte wszystkie jego notatki.

Adnotacja:

@OnDelete(action = OnDeleteAction.CASCADE)

Dodaje kaskadowe usuwanie na poziomie schematu bazy danych (w przeciwieństwie do opcji cascade annotacji), dzięki czemu podczas usuwania użytkownika, usunięte zostaną wszystkie jego notatki.

Potrzebne jest inne rozwiązanie tego problemu, jednak aktualnie jest to jedyna opcja.

Polishenglish

Wstęp

Mechanizm wtyczek dostarcza narzędzi, które umożliwiają wtyczkom korzystanie z bazy danych. Zalecanym sposobem jest używanie biblioteki Hibernate.

Wtyczka może uzyskać dostęp do jakiejkolwiek bazy danych, jednak w tym rozdziale opisana zostanie tylko obsługa systemowej bazy danych.

Konfiguracja obiektów

W rozdziale Konfiguracja kontekstu wtyczki opisane zostało, w jaki sposób dodawać beany do kontekstu. Obsługa bazy danych bazować będzie na integracji SpringFramework i Hibernate. Opisana zostanie konfiguracja XML.

Aby zarejestrować SessionFactory wystarczy dodać taką deklarację bean'a. Obiekt automatycznie konfiguruje używany

Introduction

 

The plug-in mechanism provides tools that allow plug-ins to use the database. The recommended method is to use the Hibernate library.

The plug-in can get access to any database, but this chapter will describe only the system's database support.


Objects configuration

Chapter Plugin context configuration describes how to add beany to the context. The database support will be based on the integration of SpringFramework and HibernateThe XMLconfiguration will be described.

To register the SessionFactory, just add such a bean declaration. The object automatically configures the used dialect, datasource etc.

Code Block
languagehtml/xml
titleplugin-context.xml
<bean id="sessionFactory" class="com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean">
	<property name="packagesToScan" value="com.suncode.plugin.tutorial" />
</bean>
Info

Klasa Classcom.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean bazuje na klasie LocalSessionFactoryBean. Tam również znajduje się dokumentacja.

 

Prawdopodobnie chcemy także wykorzystać inne mechanizmy, które upraszczają kod transakcyjny

is based on class LocalSessionFactoryBean. Documentation i salso located there.

 

We probably want to use other mechanisms that simplify the transaction code:

Code Block
languagehtml/xml
titleplugin-context.xml
<!-- adnotacje @Transactional -->
<tx:annotation-driven/>
 
<!-- TransactionManager -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>

Przykład działania

Teraz należy stworzyć naszą encję

Usage example 

 Now create our entity:

Code Block
languagejava
titleNote
@Entity
@Table(name = "pm_tutorial_note")
@SequenceGenerator(name = "note", sequenceName = "pm_tutorial_note_id")
public class Note {
 
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "note")
	private Long id;
 
	@Column(length = 2000)
	private String text;
 
	// getters...
	// setters...
}
Note

Nazwy tabel, kolumn i sequencerów nie powinny przekraczać 30 znaków (limit Oracle)

 

Zapis i odczyt naszego obiektu może wyglądać tak

Names of tables, columns and sequencers should not exceed 30 characters (Oracle limit).

 

Saving and reading of our object may look like this:

Code Block
languagejava
titleNoteService
@Service
@Transactional
public class NoteService {
 
	@Autowired
	private SessionFactory sessionFactory;
 
	public void saveNote(Note note){
		sessionFactory.getCurrentSession().save(note);
	}
 
	public Note getNote(Long id){
		return (Note) sessionFactory.getCurrentSession().get(Note.class, id);
	}
}
Tip

Jakiekolwiek zmiany dokonane we wtyczce nie wymagają restartu serwera. Nawet zmiany mappingu hibernate są widoczne po aktualizacji wtyczki.

Wykorzystanie w mappingu systemowych encji

Może się zdarzyć, że w naszej encji potrzebujemy mapping np. na użytkownika systemu. W takim wypadku musimy zaimportować mapping użytkownika, żeby nasza instancja SessionFactory miała wszystkie potrzebne do zapisu w bazie danych informacje.

Import mappingów z systemu odbywa się podczas konfiguracji SessionFactory Hibernate'a:

Code Block
languagehtml/xml
titleplugin-context.xml
<bean id="sessionFactory" class="com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean">
	<property name="packagesToScan" value="com.suncode.plugin.tutorial" />
	
	<!-- Musimy zaimportować całe drzewo zależności -->
	<property name="importedMappings">
		<array>
			<value>com.suncode.pwfl.administration.user.User</value>
			<value>com.suncode.pwfl.administration.user.UserGroup</value>
			<value>com.suncode.pwfl.administration.structure.Position</value>
			<value>com.suncode.pwfl.administration.structure.OrganizationalUnit</value>
			<value>com.suncode.pwfl.administration.structure.Role</value>
		</array>
	</property>
</bean>
Note

Aktualnie musimy samodzielnie wypisać wszystkie zależności, nawet te przejściowe. Jeżeli chcemy zaimportować tylko użytkownika, musimy zaimportować jeszcze 4 inne mappingi jak pokazano powyżej.

Planowane jest poprawienie sposobu importu mappingów.

 

Nasza zaktualizowana encja:

Code Block
languagejava
titleNote
@Entity
@Table(name = "pm_tutorial_note")
@SequenceGenerator(name = "note", sequenceName = "pm_tutorial_note_id")
public class Note {
 
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "note")
	private Long id;
 
	@Column(length = 2000)
	private String text;
	
	@ManyToOne
    @JoinColumn(name = "user_id")
    @OnDelete(action = OnDeleteAction.CASCADE)
	private User user;
 
	// getters...
	// setters...
}
Tip

Dodanie obiektu użytkownika do naszej encji zaowocuje dodaniem klucza obcego w schemacie bazy danych. Niestety w takim wypadku nie będzie możliwe usunięcie użytkownika z systemu, dopóki nie zostaną usunięte wszystkie jego notatki.

Adnotacja:

@OnDelete(action = OnDeleteAction.CASCADE)

Dodaje kaskadowe usuwanie na poziomie schematu bazy danych (w przeciwieństwie do opcji cascade annotacji), dzięki czemu podczas usuwania użytkownika, usunięte zostaną wszystkie jego notatki.

Potrzebne jest inne rozwiązanie tego problemu, jednak aktualnie jest to jedyna opcja.

English

Wstęp

Mechanizm wtyczek dostarcza narzędzi, które umożliwiają wtyczkom korzystanie z bazy danych. Zalecanym sposobem jest używanie biblioteki Hibernate.

Wtyczka może uzyskać dostęp do jakiejkolwiek bazy danych, jednak w tym rozdziale opisana zostanie tylko obsługa systemowej bazy danych.

Konfiguracja obiektów

W rozdziale Konfiguracja kontekstu wtyczki opisane zostało, w jaki sposób dodawać beany do kontekstu. Obsługa bazy danych bazować będzie na integracji SpringFramework i Hibernate. Opisana zostanie konfiguracja XML.

Aby zarejestrować SessionFactory wystarczy dodać taką deklarację bean'a. Obiekt automatycznie konfiguruje używany dialect, datasource etc.

Code Block
languagehtml/xml
titleplugin-context.xml
<bean id="sessionFactory" class="com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean">
	<property name="packagesToScan" value="com.suncode.plugin.tutorial" />
</bean>
Info

Klasa com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean bazuje na klasie LocalSessionFactoryBean. Tam również znajduje się dokumentacja.

 

Prawdopodobnie chcemy także wykorzystać inne mechanizmy, które upraszczają kod transakcyjny:

Code Block
languagehtml/xml
titleplugin-context.xml
<!-- adnotacje @Transactional -->
<tx:annotation-driven/>
 
<!-- TransactionManager -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>

Przykład działania

Teraz należy stworzyć naszą encję:

Code Block
languagejava
titleNote
@Entity
@Table(name = "pm_tutorial_note")
@SequenceGenerator(name = "note", sequenceName = "pm_tutorial_note_id")
public class Note {
 
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "note")
	private Long id;
 
	@Column(length = 2000)
	private String text;
 
	// getters...
	// setters...
}
Note

Nazwy tabel, kolumn i sequencerów nie powinny przekraczać 30 znaków (limit Oracle)

 

Zapis i odczyt naszego obiektu może wyglądać tak:

Code Block
languagejava
titleNoteService
@Service
@Transactional
public class NoteService {
 
	@Autowired
	private SessionFactory sessionFactory;
 
	public void saveNote(Note note){
		sessionFactory.getCurrentSession().save(note);
	}
 
	public Note getNote(Long id){
		return (Note) sessionFactory.getCurrentSession().get(Note.class, id);
	}
}
Tip

Jakiekolwiek zmiany dokonane we wtyczce nie wymagają restartu serwera. Nawet zmiany mappingu hibernate są widoczne po aktualizacji wtyczki.

Wykorzystanie w mappingu systemowych encji

Może się zdarzyć, że w naszej encji potrzebujemy mapping np. na użytkownika systemu. W takim wypadku musimy zaimportować mapping użytkownika, żeby nasza instancja SessionFactory miała wszystkie potrzebne do zapisu w bazie danych informacje.

Import mappingów z systemu odbywa się podczas konfiguracji SessionFactory Hibernate'a

Any changes made to the plugin do not require a server restart. Even the hibernate mapping changes are visible after updating the plugin.

Use of system entities in mapping 

It may happen that in our entity we need mapping, eg for the system user. In this case, we need to import the user mapping so that our SessionFactory instance has all the information needed to write into the database.

The import of mappings from the system takes place during the configuration of the Hibernate SessionFactory:

Code Block
languagehtml/xml
titleplugin-context.xml
<bean id="sessionFactory" class="com.suncode.pwfl.persistence.support.hibernate.SystemBaseSessionFactoryBean">
	<property name="packagesToScan" value="com.suncode.plugin.tutorial" />
	
	<!-- MusimyWe zaimportowaćneed całeto drzewoimport zależności the entire dependency tree -->
	<property name="importedMappings">
		<array>
			<value>com.suncode.pwfl.administration.user.User</value>
			<value>com.suncode.pwfl.administration.user.UserGroup</value>
			<value>com.suncode.pwfl.administration.structure.Position</value>
			<value>com.suncode.pwfl.administration.structure.OrganizationalUnit</value>
			<value>com.suncode.pwfl.administration.structure.Role</value>
		</array>
	</property>
</bean>
Note

Aktualnie musimy samodzielnie wypisać wszystkie zależności, nawet te przejściowe. Jeżeli chcemy zaimportować tylko użytkownika, musimy zaimportować jeszcze 4 inne mappingi jak pokazano powyżej.

Planowane jest poprawienie sposobu importu mappingów.

 

Nasza zaktualizowana encja

Currently, we have to write all dependencies, even transient ones. If we want to import only the user, we need to import another 4 mappings as shown above.

It is planned to improve the mapping import method.

 

Our updated entity:

Code Block
languagejava
titleNote
@Entity
@Table(name = "pm_tutorial_note")
@SequenceGenerator(name = "note", sequenceName = "pm_tutorial_note_id")
public class Note {
 
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "note")
	private Long id;
 
	@Column(length = 2000)
	private String text;
	
	@ManyToOne
    @JoinColumn(name = "user_id")
    @OnDelete(action = OnDeleteAction.CASCADE)
	private User user;
 
	// getters...
	// setters...
}
Tip

Dodanie obiektu użytkownika do naszej encji zaowocuje dodaniem klucza obcego w schemacie bazy danych. Niestety w takim wypadku nie będzie możliwe usunięcie użytkownika z systemu, dopóki nie zostaną usunięte wszystkie jego notatki.

Adnotacja

Adding a user object to our entity will result in adding a foreign key in the database schema. Unfortunately, in this case it will not be possible to remove the user from the system until all his notes have been deleted.

Annotation:

@OnDelete(action = OnDeleteAction.CASCADE)

Dodaje kaskadowe usuwanie na poziomie schematu bazy danych (w przeciwieństwie do opcji cascade annotacji), dzięki czemu podczas usuwania użytkownika, usunięte zostaną wszystkie jego notatki.

Potrzebne jest inne rozwiązanie tego problemu, jednak aktualnie jest to jedyna opcja.

Adds cascading delete at the database schema level (unlike the cascade annotation option), so that when deleting a user, all of his notes will be deleted.

There is a need for a different solution to this problem, but currently this is the only option.