W SEAMie baza danych jest używana domyślnie za pośrednictwem Hibernate. Jedną z użytecznych cech Hibernata jest możliwość re-kreacji i tworzenia tabel w bazie danych na podstawie zdefiniowanych encji. Szczególnie się to przydaje podczas opracowywania/modyfikacji tabel oraz testowania zmian w nich.
W tym celu należy w profilu (tutaj plik resources/META-INF/persistence-[nazwa_profilu].xml) ustawić w tagu
W poniższych przykładach użyjemy konwencji, zgodnie z którą wszelkie adnotacje są albo przy deklaracji klasy, albo przy deklaracji pól. Metody są pomijane i nie są pokazane w przykładach dla przejrzystości. Kod SQL podany został w dialekcie PostgreSQL.
Oto najprostszy przykład, definijący tabelę z identyfikatorem:
@Name("example1")
@Entity
@Scope(SESSION)
@Table(name = "example1_table")
public class Example1Tbl implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column
private Long id;
...
}
Znaczenie interesujących nas adnotacji:
Przykład z zaimplementowaną autoinkrementacją klucza głównego:
@Name("example2")
@Entity
@Scope(SESSION)
@Table(name = "example2_table")
@SequenceGenerator(name = "example_seq", sequenceName = "example_seq", allocationSize = 1)
public class Example2Tbl implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "example_seq")
private Long id;
...
}
Znaczenie nowych adnotacji:
Bardziej skomplikowany przykład, prezentujący kilka kombinacji definiowania kolumn tabeli z uwzględnieniem UNIQUE:
@Name("example3")
@Entity
@Scope(SESSION)
@Table(name = "example3_table",
uniqueConstraints = @UniqueConstraint(columnNames = {"sometext", "someothertext" }))
public class Example3Tbl implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "example_seq")
private Long id;
@Column(nullable = true, length = 75)
private String sometext;
@Column
private String someothertext;
@Column(nullable = false, unique = true)
private Integer someinteger;
@Lob
@Column(nullable = false)
private String somelongtext;
...
}
Znaczenie nowych adnotacji/parametrów:
@Table:
@Column:
@Lob - definiuje duży obiekt. Przy klasie String baza danych będzie miała typ pola "text" lub jego odpowiednik.
Ostatni przykład pokazuje, jak utworzyć klucze obce.
@Name("example4")
@Entity
@Scope(SESSION)
@Table(name = "example4_table")
public class Example4Tbl implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "example_seq")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_example3", nullable = false)
private Example3Tbl example3;
}
Nowe adnotacje:
Hibernate wie, do której tabeli dowiązać połączenie na podstawie klasy (tutaj Example3Tbl) pola.