1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package ch.elca.el4j.services.persistence.hibernate;
18
19 import java.io.Serializable;
20 import java.sql.PreparedStatement;
21 import java.sql.SQLException;
22
23 import org.hibernate.HibernateException;
24 import org.hibernate.dialect.Dialect;
25 import org.hibernate.engine.SessionImplementor;
26 import org.hibernate.id.AbstractPostInsertGenerator;
27 import org.hibernate.id.IdentifierGeneratorHelper;
28 import org.hibernate.id.PostInsertIdentityPersister;
29 import org.hibernate.id.SequenceIdentityGenerator.NoCommentsInsert;
30 import org.hibernate.id.insert.AbstractReturningDelegate;
31 import org.hibernate.id.insert.IdentifierGeneratingInsert;
32 import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class TriggerAssignedIdentityGenerator extends AbstractPostInsertGenerator {
51
52
53
54 public InsertGeneratedIdentifierDelegate getInsertGeneratedIdentifierDelegate(
55 PostInsertIdentityPersister persister, Dialect dialect, boolean isGetGeneratedKeysEnabled)
56 throws HibernateException {
57 return new Delegate(persister, dialect);
58 }
59
60
61
62
63 public static class Delegate extends AbstractReturningDelegate {
64
65
66
67 private final Dialect m_dialect;
68
69
70
71
72 private final String[] m_keyColumns;
73
74
75
76
77
78 public Delegate(PostInsertIdentityPersister persister, Dialect dialect) {
79 super(persister);
80 m_dialect = dialect;
81 m_keyColumns = getPersister().getRootTableKeyColumnNames();
82 if (m_keyColumns.length > 1) {
83 throw new HibernateException(
84 "trigger assigned identity generator cannot be used with multi-column keys");
85 }
86 }
87
88
89
90
91
92
93 public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert() {
94 NoCommentsInsert insert = new NoCommentsInsert(m_dialect);
95 return insert;
96 }
97
98
99
100
101 protected PreparedStatement prepare(String insertSQL, SessionImplementor session) throws SQLException {
102 return session.getBatcher().prepareStatement(insertSQL, m_keyColumns);
103 }
104
105
106
107
108 protected Serializable executeAndExtract(PreparedStatement insert) throws SQLException {
109 insert.executeUpdate();
110 return IdentifierGeneratorHelper.getGeneratedIdentity(
111 insert.getGeneratedKeys(),
112 getPersister().getIdentifierType());
113 }
114 }
115 }