(empty log message)
@@ -2,11 +2,16 @@ | ||
2 | 2 | |
3 | 3 | import javax.persistence.Column; |
4 | 4 | import javax.persistence.Entity; |
5 | +import javax.persistence.JoinColumn; | |
6 | +import javax.persistence.ManyToOne; | |
5 | 7 | import javax.persistence.Table; |
6 | 8 | import javax.persistence.UniqueConstraint; |
7 | 9 | |
10 | +import org.hibernate.annotations.JoinColumnOrFormula; | |
11 | +import org.hibernate.annotations.JoinColumnsOrFormulas; | |
12 | +import org.hibernate.annotations.JoinFormula; | |
8 | 13 | import org.phosphoresce.webcore.core.transaction.TransactionUser; |
9 | -import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateEntity; | |
14 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDefaultEntity; | |
10 | 15 | |
11 | 16 | /** |
12 | 17 | * システムユーザーテーブルのエンティティインタフェースを提供します。<br> |
@@ -29,7 +34,7 @@ | ||
29 | 34 | uniqueConstraints = { // |
30 | 35 | @UniqueConstraint(columnNames = { "delete_date", "code" }) // |
31 | 36 | }) |
32 | -public class SUser extends AbstractHibernateEntity implements TransactionUser { | |
37 | +public class SUser extends AbstractHibernateDefaultEntity implements TransactionUser { | |
33 | 38 | |
34 | 39 | /** ユーザーコード */ |
35 | 40 | @Column(name = "code", nullable = false, length = 32) |
@@ -47,6 +52,15 @@ | ||
47 | 52 | @Column(name = "last_name", nullable = false, length = 32) |
48 | 53 | private String lastName; |
49 | 54 | |
55 | + /** ユーザー権限 */ | |
56 | + @ManyToOne | |
57 | + //@JoinFormula(referencedColumnName = "code", value = "(select s_code.code from s_code where s_code.category = 'S0002' and s_code.code = role_type)") | |
58 | + @JoinColumnsOrFormulas({ // | |
59 | + @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "category", value = "'S0002'")), // | |
60 | + @JoinColumnOrFormula(column = @JoinColumn(referencedColumnName = "code", name = "role_type", nullable = false)) // | |
61 | + }) | |
62 | + private SCode roleType; | |
63 | + | |
50 | 64 | /** |
51 | 65 | * データベース登録処理前のエンティティ内容の整合処理を実施します。<br> |
52 | 66 | * 当処理はエンティティ毎に処理が異なります。<br> |
@@ -119,4 +133,20 @@ | ||
119 | 133 | public final void setLastName(String lastName) { |
120 | 134 | this.lastName = lastName; |
121 | 135 | } |
136 | + | |
137 | + /** | |
138 | + * ユーザー権限を取得します。<br> | |
139 | + * @return ユーザー権限 | |
140 | + */ | |
141 | + public SCode getRoleType() { | |
142 | + return roleType; | |
143 | + } | |
144 | + | |
145 | + /** | |
146 | + * ユーザー権限を設定します。<br> | |
147 | + * @param roleType ユーザー権限 | |
148 | + */ | |
149 | + public void setRoleType(SCode roleType) { | |
150 | + this.roleType = roleType; | |
151 | + } | |
122 | 152 | } |
@@ -0,0 +1,159 @@ | ||
1 | +package org.phosphoresce.webcore.ext.hibernate4.model; | |
2 | + | |
3 | +import javax.persistence.Column; | |
4 | +import javax.persistence.Entity; | |
5 | +import javax.persistence.Table; | |
6 | +import javax.persistence.UniqueConstraint; | |
7 | + | |
8 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateEntity; | |
9 | + | |
10 | +/** | |
11 | + * システム環境設定テーブルのエンティティインタフェースを提供します。<br> | |
12 | + * <p> | |
13 | + * システム内部で管理される各種設定情報が保存されるテーブルエンティティです。<br> | |
14 | + * アプリケーション側で業務的に直接利用されることは想定されません。<br> | |
15 | + * </p> | |
16 | + * | |
17 | + * @author Kitagawa<br> | |
18 | + * | |
19 | + *<!-- | |
20 | + * 更新日 更新者 更新内容 | |
21 | + * 2013/02/01 Kitagawa 新規作成 | |
22 | + *--> | |
23 | + */ | |
24 | +@Entity | |
25 | +@Table(name = "s_config", // | |
26 | +uniqueConstraints = { // | |
27 | +@UniqueConstraint(columnNames = { "property" }) // | |
28 | +}) | |
29 | +public class SConfig extends AbstractHibernateEntity { | |
30 | + | |
31 | + /** プロパティキー */ | |
32 | + @Column(name = "property", nullable = false, length = 32) | |
33 | + private String property; | |
34 | + | |
35 | + /** 設定値1 */ | |
36 | + @Column(name = "value_1", length = 50) | |
37 | + private String value1; | |
38 | + | |
39 | + /** 設定値2 */ | |
40 | + @Column(name = "value_2", length = 50) | |
41 | + private String value2; | |
42 | + | |
43 | + /** 設定値3 */ | |
44 | + @Column(name = "value_3", length = 50) | |
45 | + private String value3; | |
46 | + | |
47 | + /** 設定値4 */ | |
48 | + @Column(name = "value_4", length = 50) | |
49 | + private String value4; | |
50 | + | |
51 | + /** 設定値5 */ | |
52 | + @Column(name = "value_5", length = 50) | |
53 | + private String value5; | |
54 | + | |
55 | + /** | |
56 | + * データベース登録処理前のエンティティ内容の整合処理を実施します。<br> | |
57 | + * 当処理はエンティティ毎に処理が異なります。<br> | |
58 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateEntity#validateEntity() | |
59 | + */ | |
60 | + @Override | |
61 | + protected void validateEntity() { | |
62 | + } | |
63 | + | |
64 | + /** | |
65 | + * プロパティキーを取得します。<br> | |
66 | + * @return プロパティキー | |
67 | + */ | |
68 | + public String getProperty() { | |
69 | + return property; | |
70 | + } | |
71 | + | |
72 | + /** | |
73 | + * プロパティキーを設定します。<br> | |
74 | + * @param property プロパティキー | |
75 | + */ | |
76 | + public void setProperty(String property) { | |
77 | + this.property = property; | |
78 | + } | |
79 | + | |
80 | + /** | |
81 | + * 設定値1を取得します。<br> | |
82 | + * @return 設定値1 | |
83 | + */ | |
84 | + public String getValue1() { | |
85 | + return value1; | |
86 | + } | |
87 | + | |
88 | + /** | |
89 | + * 設定値1を設定します。<br> | |
90 | + * @param value1 設定値1 | |
91 | + */ | |
92 | + public void setValue1(String value1) { | |
93 | + this.value1 = value1; | |
94 | + } | |
95 | + | |
96 | + /** | |
97 | + * 設定値2を取得します。<br> | |
98 | + * @return 設定値2 | |
99 | + */ | |
100 | + public String getValue2() { | |
101 | + return value2; | |
102 | + } | |
103 | + | |
104 | + /** | |
105 | + * 設定値2を設定します。<br> | |
106 | + * @param value2 設定値2 | |
107 | + */ | |
108 | + public void setValue2(String value2) { | |
109 | + this.value2 = value2; | |
110 | + } | |
111 | + | |
112 | + /** | |
113 | + * 設定値3を取得します。<br> | |
114 | + * @return 設定値3 | |
115 | + */ | |
116 | + public String getValue3() { | |
117 | + return value3; | |
118 | + } | |
119 | + | |
120 | + /** | |
121 | + * 設定値3を設定します。<br> | |
122 | + * @param value3 設定値3 | |
123 | + */ | |
124 | + public void setValue3(String value3) { | |
125 | + this.value3 = value3; | |
126 | + } | |
127 | + | |
128 | + /** | |
129 | + * 設定値4を取得します。<br> | |
130 | + * @return 設定値4 | |
131 | + */ | |
132 | + public String getValue4() { | |
133 | + return value4; | |
134 | + } | |
135 | + | |
136 | + /** | |
137 | + * 設定値4を設定します。<br> | |
138 | + * @param value4 設定値4 | |
139 | + */ | |
140 | + public void setValue4(String value4) { | |
141 | + this.value4 = value4; | |
142 | + } | |
143 | + | |
144 | + /** | |
145 | + * 設定値5を取得します。<br> | |
146 | + * @return 設定値5 | |
147 | + */ | |
148 | + public String getValue5() { | |
149 | + return value5; | |
150 | + } | |
151 | + | |
152 | + /** | |
153 | + * 設定値5を設定します。<br> | |
154 | + * @param value5 設定値5 | |
155 | + */ | |
156 | + public void setValue5(String value5) { | |
157 | + this.value5 = value5; | |
158 | + } | |
159 | +} |
@@ -5,7 +5,7 @@ | ||
5 | 5 | import javax.persistence.Table; |
6 | 6 | import javax.persistence.UniqueConstraint; |
7 | 7 | |
8 | -import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateExpirableEntity; | |
8 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateEntity; | |
9 | 9 | |
10 | 10 | /** |
11 | 11 | * システムコードマスタテーブルのエンティティインタフェースを提供します。<br> |
@@ -24,9 +24,9 @@ | ||
24 | 24 | @Entity |
25 | 25 | @Table(name = "s_code", // |
26 | 26 | uniqueConstraints = { // |
27 | -@UniqueConstraint(columnNames = { "delete_date", "expiry_start", "expiry_end", "category", "code" }) // | |
27 | +@UniqueConstraint(columnNames = { "category", "code" }) // | |
28 | 28 | }) |
29 | -public class SCode extends AbstractHibernateExpirableEntity { | |
29 | +public class SCode extends AbstractHibernateEntity { | |
30 | 30 | |
31 | 31 | /** カテゴリ */ |
32 | 32 | @Column(name = "category", nullable = false, length = 5) |
@@ -5,8 +5,10 @@ | ||
5 | 5 | |
6 | 6 | import org.hibernate.criterion.Order; |
7 | 7 | import org.phosphoresce.webcore.ext.hibernate4.dao.SCodeDAO; |
8 | +import org.phosphoresce.webcore.ext.hibernate4.dao.SConfigDAO; | |
8 | 9 | import org.phosphoresce.webcore.ext.hibernate4.dao.SUserDAO; |
9 | 10 | import org.phosphoresce.webcore.ext.hibernate4.model.SCode; |
11 | +import org.phosphoresce.webcore.ext.hibernate4.model.SConfig; | |
10 | 12 | import org.phosphoresce.webcore.ext.hibernate4.model.SUser; |
11 | 13 | import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateService; |
12 | 14 | import org.phosphoresce.webcore.ext.hibernate4.transaction.HibernateTransactionContext; |
@@ -27,6 +29,9 @@ | ||
27 | 29 | */ |
28 | 30 | public class SystemMasterService extends AbstractHibernateService<SUser> { |
29 | 31 | |
32 | + /** システム環境設定マスタテーブルアクセスオブジェクト */ | |
33 | + private SConfigDAO sConfigDAO; | |
34 | + | |
30 | 35 | /** システムコードマスタテーブルアクセスオブジェクト */ |
31 | 36 | private SCodeDAO sCodeDAO; |
32 | 37 |
@@ -39,18 +44,60 @@ | ||
39 | 44 | */ |
40 | 45 | public SystemMasterService(HibernateTransactionContext<SUser> transactionContext) { |
41 | 46 | super(transactionContext); |
47 | + sConfigDAO = createDAO(SConfigDAO.class); | |
42 | 48 | sCodeDAO = createDAO(SCodeDAO.class); |
43 | 49 | sUserDAO = createDAO(SUserDAO.class); |
44 | 50 | } |
45 | 51 | |
46 | 52 | /** |
47 | - * システムに登録されている全てのシステムマスタを取得します。<br> | |
48 | - * @return 全てのシステムマスタレコードリスト | |
53 | + * システムに登録されている全てのシステム環境設定マスタを取得します。<br> | |
54 | + * @return 全てのシステム環境設定マスタエンティティリスト | |
49 | 55 | */ |
50 | - public List<SCode> searchAllSCode() { | |
56 | + public List<SConfig> getAllSConfig() { | |
51 | 57 | List<Order> orders = new LinkedList<Order>(); |
58 | + orders.add(Order.asc("property")); | |
59 | + return sConfigDAO.findAll(orders); | |
60 | + } | |
61 | + | |
62 | + /** | |
63 | + * 指定されたプロパティのシステム環境設定マスタを取得します。<br> | |
64 | + * @return システム環境設定マスタエンティティ | |
65 | + */ | |
66 | + public SConfig getSConfigByProperty(String property) { | |
67 | + return sConfigDAO.findByProperty(property); | |
68 | + } | |
69 | + | |
70 | + /** | |
71 | + * 指定されたシステム環境設定マスタを登録します。<br> | |
72 | + * @param sCode システム環境設定マスタエンティティ | |
73 | + */ | |
74 | + public void registSConfig(SConfig sConfig) { | |
75 | + save(sConfig); | |
76 | + } | |
77 | + | |
78 | + /** | |
79 | + * システムに登録されている全てのシステムコードマスタを取得します。<br> | |
80 | + * @return 全てのシステムコードマスタエンティティリスト | |
81 | + */ | |
82 | + public List<SCode> getAllSCode() { | |
83 | + List<Order> orders = new LinkedList<Order>(); | |
52 | 84 | orders.add(Order.asc("category")); |
53 | 85 | orders.add(Order.asc("orderNo")); |
54 | 86 | return sCodeDAO.findAll(orders); |
55 | 87 | } |
88 | + | |
89 | + /** | |
90 | + * 指定されたシステムコードマスタを登録します。<br> | |
91 | + * @param sCode システムコードマスタエンティティ | |
92 | + */ | |
93 | + public void registSCode(SCode sCode) { | |
94 | + save(sCode); | |
95 | + } | |
96 | + | |
97 | + /** | |
98 | + * 全てのシステムコードマスタを物理削除します。<br> | |
99 | + */ | |
100 | + public void removeAllSCode() { | |
101 | + sCodeDAO.removeAll(); | |
102 | + } | |
56 | 103 | } |
@@ -2,9 +2,10 @@ | ||
2 | 2 | |
3 | 3 | import static org.hibernate.criterion.Restrictions.*; |
4 | 4 | |
5 | +import org.hibernate.SQLQuery; | |
5 | 6 | import org.phosphoresce.webcore.ext.hibernate4.annotation.HibernateDAO; |
6 | 7 | import org.phosphoresce.webcore.ext.hibernate4.model.SCode; |
7 | -import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO; | |
8 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractGenericHibernateDAO; | |
8 | 9 | import org.phosphoresce.webcore.ext.hibernate4.transaction.GenericCriteria; |
9 | 10 | import org.phosphoresce.webcore.ext.hibernate4.transaction.HibernateTransactionManager; |
10 | 11 |
@@ -23,7 +24,7 @@ | ||
23 | 24 | *--> |
24 | 25 | */ |
25 | 26 | @HibernateDAO(entity = SCode.class) |
26 | -public class SCodeDAO extends AbstractHibernateDAO<SCode> { | |
27 | +public class SCodeDAO extends AbstractGenericHibernateDAO<SCode> { | |
27 | 28 | |
28 | 29 | /** |
29 | 30 | * コンストラクタ<br> |
@@ -40,9 +41,17 @@ | ||
40 | 41 | * @return システムコードマスタエンティティ |
41 | 42 | */ |
42 | 43 | public SCode findByCategoryAndCode(String category, String code) { |
43 | - GenericCriteria<SCode> criteria = createCriteriaExcludeDeleted(); | |
44 | + GenericCriteria<SCode> criteria = createCriteria(); | |
44 | 45 | criteria.add(eq("category", category)); |
45 | 46 | criteria.add(eq("code", code)); |
46 | 47 | return criteria.uniqueResult(); |
47 | 48 | } |
49 | + | |
50 | + /** | |
51 | + * 全てのシステムコードマスタを物理削除します。<br> | |
52 | + */ | |
53 | + public void removeAll() { | |
54 | + SQLQuery query = createSQLQuery("delete from s_code"); | |
55 | + query.executeUpdate(); | |
56 | + } | |
48 | 57 | } |
@@ -4,7 +4,7 @@ | ||
4 | 4 | |
5 | 5 | import org.phosphoresce.webcore.ext.hibernate4.annotation.HibernateDAO; |
6 | 6 | import org.phosphoresce.webcore.ext.hibernate4.model.SUser; |
7 | -import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO; | |
7 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractGenericHibernateDAO; | |
8 | 8 | import org.phosphoresce.webcore.ext.hibernate4.transaction.GenericCriteria; |
9 | 9 | import org.phosphoresce.webcore.ext.hibernate4.transaction.HibernateTransactionManager; |
10 | 10 |
@@ -23,7 +23,7 @@ | ||
23 | 23 | *--> |
24 | 24 | */ |
25 | 25 | @HibernateDAO(entity = SUser.class) |
26 | -public class SUserDAO extends AbstractHibernateDAO<SUser> { | |
26 | +public class SUserDAO extends AbstractGenericHibernateDAO<SUser> { | |
27 | 27 | |
28 | 28 | /** |
29 | 29 | * コンストラクタ<br> |
@@ -0,0 +1,48 @@ | ||
1 | +package org.phosphoresce.webcore.ext.hibernate4.dao; | |
2 | + | |
3 | +import static org.hibernate.criterion.Restrictions.*; | |
4 | + | |
5 | +import org.phosphoresce.webcore.ext.hibernate4.annotation.HibernateDAO; | |
6 | +import org.phosphoresce.webcore.ext.hibernate4.model.SConfig; | |
7 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractGenericHibernateDAO; | |
8 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.GenericCriteria; | |
9 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.HibernateTransactionManager; | |
10 | + | |
11 | +/** | |
12 | + * システム環境設定テーブルのエンティティへのアクセスインタフェースを提供します。<br> | |
13 | + * <p> | |
14 | + * テーブルエンティティに対する汎用的なアクセスインタフェースが提供されます。<br> | |
15 | + * 業務処理依存するアクセスインタフェースは提供されません。<br> | |
16 | + * </p> | |
17 | + * | |
18 | + * @author Kitagawa<br> | |
19 | + * | |
20 | + *<!-- | |
21 | + * 更新日 更新者 更新内容 | |
22 | + * 2013/02/01 Kitagawa 新規作成 | |
23 | + *--> | |
24 | + */ | |
25 | +@HibernateDAO(entity = SConfig.class) | |
26 | +public class SConfigDAO extends AbstractGenericHibernateDAO<SConfig> { | |
27 | + | |
28 | + /** | |
29 | + * コンストラクタ<br> | |
30 | + * @param transaction トランザクション管理オブジェクト | |
31 | + */ | |
32 | + public SConfigDAO(HibernateTransactionManager transaction) { | |
33 | + super(transaction); | |
34 | + } | |
35 | + | |
36 | + /** | |
37 | + * 指定されたユーザーコードで検索を行います。<br> | |
38 | + * @param code ユーザーコード | |
39 | + * @return エンティティオブジェクト | |
40 | + */ | |
41 | + public SConfig findByProperty(String property) { | |
42 | + GenericCriteria<SConfig> criteria = createCriteria(); | |
43 | + | |
44 | + criteria.add(eq("property", property)); | |
45 | + | |
46 | + return criteria.uniqueResult(); | |
47 | + } | |
48 | +} |
@@ -10,7 +10,6 @@ | ||
10 | 10 | import org.hibernate.LockMode; |
11 | 11 | import org.hibernate.ScrollMode; |
12 | 12 | import org.hibernate.ScrollableResults; |
13 | -import org.hibernate.Session; | |
14 | 13 | import org.hibernate.criterion.Criterion; |
15 | 14 | import org.hibernate.criterion.Order; |
16 | 15 | import org.hibernate.criterion.Projection; |
@@ -63,7 +62,8 @@ | ||
63 | 62 | * @return レコード件数 |
64 | 63 | */ |
65 | 64 | public long count() { |
66 | - long count = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();; | |
65 | + long count = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult(); | |
66 | + ; | |
67 | 67 | criteria.setProjection(null); |
68 | 68 | return count; |
69 | 69 | } |
@@ -1,27 +1,21 @@ | ||
1 | 1 | package org.phosphoresce.webcore.ext.hibernate4.transaction; |
2 | 2 | |
3 | 3 | import java.io.Serializable; |
4 | -import java.util.Date; | |
5 | 4 | |
6 | 5 | import javax.persistence.Column; |
7 | 6 | import javax.persistence.GeneratedValue; |
8 | 7 | import javax.persistence.GenerationType; |
9 | 8 | import javax.persistence.Id; |
10 | -import javax.persistence.JoinColumn; | |
11 | -import javax.persistence.ManyToOne; | |
12 | 9 | import javax.persistence.MappedSuperclass; |
13 | 10 | import javax.persistence.Version; |
14 | 11 | |
15 | -import org.hibernate.annotations.Where; | |
16 | -import org.phosphoresce.webcore.ext.hibernate4.model.SCode; | |
17 | -import org.phosphoresce.webcore.ext.hibernate4.model.SUser; | |
18 | - | |
19 | 12 | /** |
20 | - * データベーステーブルエンティティの共通カラムフィールドインタフェースを提供します。<br> | |
13 | + * Hibernateエンティティ共通カラムフィールドインタフェースを提供します。<br> | |
21 | 14 | * <p> |
22 | 15 | * Hibernateアドオンモジュールで利用するエンティティはすべてこのクラスが継承されて提供されます。<br> |
23 | - * これはすべてのエンティティはレコードID、レコードバージョン番号及び、登録日時、登録者情報が必ず管理されることを意味します。<br> | |
24 | - * また、これらのアクセッサインタフェースはユーザーからの利用ではGetterインタフェースのみ提供され、Setterインタフェースはアドオンモジュール側で制御するのみに制限されます。<br> | |
16 | + * ここではHibernateを利用したデータベーステーブル操作時に最低限必要となるレコードID、レコードバージョン番号カラムのみが提供されます。<br> | |
17 | + * 通常のアプリケーションで利用されるエンティティはこれを直接継承せず{@link AbstractHibernateDefaultEntity}を継承して作成されます。<br> | |
18 | + * 例外的に当エンティティが継承されて作成されるエンティティは予めアドオンが提供する{@link org.phosphoresce.webcore.ext.hibernate4.model.SCode}、{@link org.phosphoresce.webcore.ext.hibernate4.model.SConfig}となります。<br> | |
25 | 19 | * </p> |
26 | 20 | * |
27 | 21 | * @author Kitagawa<br> |
@@ -45,42 +39,6 @@ | ||
45 | 39 | @Column(name = "version_lock", nullable = false) |
46 | 40 | private Integer versionLocked; |
47 | 41 | |
48 | - /** 登録日時 */ | |
49 | - @Column(name = "entry_date") | |
50 | - private Date entryDate; | |
51 | - | |
52 | - /** 登録ユーザ */ | |
53 | - @ManyToOne | |
54 | - @JoinColumn(name = "entry_user", referencedColumnName = "code") | |
55 | - @Where(clause = "delete_type = '0'") | |
56 | - private SUser entryUser; | |
57 | - | |
58 | - /** 更新日時 */ | |
59 | - @Column(name = "modify_date") | |
60 | - private Date modifyDate; | |
61 | - | |
62 | - /** 更新ユーザ */ | |
63 | - @ManyToOne | |
64 | - @JoinColumn(name = "modify_user", referencedColumnName = "code") | |
65 | - @Where(clause = "delete_type = '0'") | |
66 | - private SUser modifyUser; | |
67 | - | |
68 | - /** 削除日時 */ | |
69 | - @Column(name = "delete_date") | |
70 | - private Date deleteDate; | |
71 | - | |
72 | - /** 削除ユーザ */ | |
73 | - @ManyToOne | |
74 | - @JoinColumn(name = "delete_user", referencedColumnName = "code") | |
75 | - @Where(clause = "delete_type = '0'") | |
76 | - private SUser deleteUser; | |
77 | - | |
78 | - /** 削除状態 */ | |
79 | - @ManyToOne | |
80 | - @JoinColumn(name = "delete_type", referencedColumnName = "code", nullable = false) | |
81 | - @Where(clause = "category = 'S0001' and delete_type = '0'") | |
82 | - private SCode deleteType; | |
83 | - | |
84 | 42 | /** |
85 | 43 | * データベース登録処理前のエンティティ内容の整合処理を実施します。<br> |
86 | 44 | */ |
@@ -125,116 +83,4 @@ | ||
125 | 83 | final void setVersionLocked(Integer versionLocked) { |
126 | 84 | this.versionLocked = versionLocked; |
127 | 85 | } |
128 | - | |
129 | - /** | |
130 | - * 登録日時を取得します。<br> | |
131 | - * @return 登録日時 | |
132 | - */ | |
133 | - public final Date getEntryDate() { | |
134 | - return entryDate; | |
135 | - } | |
136 | - | |
137 | - /** | |
138 | - * 登録日時を設定します。<br> | |
139 | - * @param entryDate 登録日時 | |
140 | - */ | |
141 | - final void setEntryDate(Date entryDate) { | |
142 | - this.entryDate = entryDate; | |
143 | - } | |
144 | - | |
145 | - /** | |
146 | - * 登録ユーザを取得します。<br> | |
147 | - * @return 登録ユーザ | |
148 | - */ | |
149 | - public SUser getEntryUser() { | |
150 | - return entryUser; | |
151 | - } | |
152 | - | |
153 | - /** | |
154 | - * 登録ユーザを設定します。<br> | |
155 | - * @param entryUser 登録ユーザ | |
156 | - */ | |
157 | - void setEntryUser(SUser entryUser) { | |
158 | - this.entryUser = entryUser; | |
159 | - } | |
160 | - | |
161 | - /** | |
162 | - * 更新日時を取得します。<br> | |
163 | - * @return 更新日時 | |
164 | - */ | |
165 | - public final Date getModifyDate() { | |
166 | - return modifyDate; | |
167 | - } | |
168 | - | |
169 | - /** | |
170 | - * 更新日時を設定します。<br> | |
171 | - * @param modifyDate 更新日時 | |
172 | - */ | |
173 | - final void setModifyDate(Date modifyDate) { | |
174 | - this.modifyDate = modifyDate; | |
175 | - } | |
176 | - | |
177 | - /** | |
178 | - * 更新ユーザを取得します。<br> | |
179 | - * @return 更新ユーザ | |
180 | - */ | |
181 | - public SUser getModifyUser() { | |
182 | - return modifyUser; | |
183 | - } | |
184 | - | |
185 | - /** | |
186 | - * 更新ユーザを設定します。<br> | |
187 | - * @param modifyUser 更新ユーザ | |
188 | - */ | |
189 | - void setModifyUser(SUser modifyUser) { | |
190 | - this.modifyUser = modifyUser; | |
191 | - } | |
192 | - | |
193 | - /** | |
194 | - * 削除日時を取得します。<br> | |
195 | - * @return 削除日時 | |
196 | - */ | |
197 | - public final Date getDeleteDate() { | |
198 | - return deleteDate; | |
199 | - } | |
200 | - | |
201 | - /** | |
202 | - * 削除日時を設定します。<br> | |
203 | - * @param deleteDate 削除日時 | |
204 | - */ | |
205 | - final void setDeleteDate(Date deleteDate) { | |
206 | - this.deleteDate = deleteDate; | |
207 | - } | |
208 | - | |
209 | - /** | |
210 | - * 削除ユーザを取得します。<br> | |
211 | - * @return 削除ユーザ | |
212 | - */ | |
213 | - public SUser getDeleteUser() { | |
214 | - return deleteUser; | |
215 | - } | |
216 | - | |
217 | - /** | |
218 | - * 削除ユーザを設定します。<br> | |
219 | - * @param deleteUser 削除ユーザ | |
220 | - */ | |
221 | - public void setDeleteUser(SUser deleteUser) { | |
222 | - this.deleteUser = deleteUser; | |
223 | - } | |
224 | - | |
225 | - /** | |
226 | - * 削除状態を取得します。<br> | |
227 | - * @return 削除状態 | |
228 | - */ | |
229 | - public SCode getDeleteType() { | |
230 | - return deleteType; | |
231 | - } | |
232 | - | |
233 | - /** | |
234 | - * 削除状態を設定します。<br> | |
235 | - * @param deleteType 削除状態 | |
236 | - */ | |
237 | - public void setDeleteType(SCode deleteType) { | |
238 | - this.deleteType = deleteType; | |
239 | - } | |
240 | 86 | } |
@@ -0,0 +1,176 @@ | ||
1 | +package org.phosphoresce.webcore.ext.hibernate4.transaction; | |
2 | + | |
3 | +import java.util.List; | |
4 | + | |
5 | +import org.hibernate.Query; | |
6 | +import org.hibernate.SQLQuery; | |
7 | +import org.hibernate.criterion.Order; | |
8 | + | |
9 | +/** | |
10 | + * エンティティに依存しない汎用的なデータベースアクセスを行う為のインタフェースを提供します。<br> | |
11 | + * <p> | |
12 | + * アプリケーション規模に応じた方式設計で、ロジッククラス、サービスクラス、DAOクラスの階層とした場合に不要にクラスリソースが増加する可能性があります。<br> | |
13 | + * その場合、当クラスをアプリケーションごとの共通サービスクラスにおいてデータベースアクセスのラッパークラスインスタンスとして提供することで、 | |
14 | + * サービスクラスから汎用的なDAOクラスのインタフェースを利用することが可能となります。<br> | |
15 | + * </p> | |
16 | + * <p> | |
17 | + * 大規模なアプリケーションの場合、サービスクラスでは、DAOクラスが提供する粒度の細かい業務処理依存のない処理インタフェースはの集合体となりますが、 | |
18 | + * 小規模なアプリケーションの場合、多くはDAOクラスが提供するインタフェースに近いサービスクラスが大量に発生する可能性があります。<br> | |
19 | + * このクラスを利用することでエンティティ毎にDAOクラスを設ける必要がなくなり、冗長的なサービスクラスとDAOクラスの関係がなくなることを意味します。<br> | |
20 | + * | |
21 | + * </p> | |
22 | + * | |
23 | + * @author Kitagawa<br> | |
24 | + * | |
25 | + *<!-- | |
26 | + * 更新日 更新者 更新内容 | |
27 | + * 2013/08/16 Kitagawa 新規作成 | |
28 | + *--> | |
29 | + */ | |
30 | +public final class GeneralHibernateDAO extends AbstractHibernateDAO { | |
31 | + | |
32 | + /** | |
33 | + * コンストラクタ<br> | |
34 | + * @param transaction トランザクション管理オブジェクト | |
35 | + */ | |
36 | + public GeneralHibernateDAO(HibernateTransactionManager transaction) { | |
37 | + super(transaction); | |
38 | + } | |
39 | + | |
40 | + /** | |
41 | + * データベースクエリ条件オブジェクトを生成します。<br> | |
42 | + * @param entityClass 対象エンティティクラス | |
43 | + * @return データベースクエリ条件オブジェクト | |
44 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#createCriteria(java.lang.Class) | |
45 | + */ | |
46 | + @Override | |
47 | + public <C extends AbstractHibernateEntity> GenericCriteria<C> createCriteria(Class<C> entityClass) { | |
48 | + return super.createCriteria(entityClass); | |
49 | + } | |
50 | + | |
51 | + /** | |
52 | + * データベースクエリ条件オブジェクトを生成します。<br> | |
53 | + * 対象エンティティが削除状態を保持するエンティティの場合、削除状態のエンティティを除外する条件を持ちます。<br> | |
54 | + * @param entityClass 対象エンティティクラス | |
55 | + * @return データベースクエリ条件オブジェクト | |
56 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#createCriteriaExcludeDeleted(java.lang.Class) | |
57 | + */ | |
58 | + @Override | |
59 | + public <C extends AbstractHibernateEntity> GenericCriteria<C> createCriteriaExcludeDeleted(Class<C> entityClass) { | |
60 | + return super.createCriteriaExcludeDeleted(entityClass); | |
61 | + } | |
62 | + | |
63 | + /** | |
64 | + * SQLデータベースクエリを生成します。<br> | |
65 | + * DAOクラスにおいて当インタフェースを利用した場合、エンティティクラスで制限がかからないクエリとなることに注意して下さい。<br> | |
66 | + * これは利用者がDAOクラスの位置づけ(エンティティ対応しているDAO)に注意して利用する必要があり、場合によってはアプリケーション開発規約で利用禁止とすることも検討して下さい。<br> | |
67 | + * @param sql SQLデータベースクエリ | |
68 | + * @return SQLデータベースクエリオブジェクト | |
69 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#createSQLQuery(java.lang.String) | |
70 | + */ | |
71 | + @Override | |
72 | + public SQLQuery createSQLQuery(String sql) { | |
73 | + return super.createSQLQuery(sql); | |
74 | + } | |
75 | + | |
76 | + /** | |
77 | + * HQLデータベースクエリを生成します。<br> | |
78 | + * DAOクラスにおいて当インタフェースを利用した場合、エンティティクラスで制限がかからないクエリとなることに注意して下さい。<br> | |
79 | + * これは利用者がDAOクラスの位置づけ(エンティティ対応しているDAO)に注意して利用する必要があり、場合によってはアプリケーション開発規約で利用禁止とすることも検討して下さい。<br> | |
80 | + * @param hql HQLデータベースクエリ | |
81 | + * @return HQLデータベースクエリオブジェクト | |
82 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#createHQLQuery(java.lang.String) | |
83 | + */ | |
84 | + @Override | |
85 | + public Query createHQLQuery(String hql) { | |
86 | + return super.createHQLQuery(hql); | |
87 | + } | |
88 | + | |
89 | + /** | |
90 | + * 指定されたレコードIDでエンティティを検索します。<br> | |
91 | + * 当インタフェースは削除済の条件は加味されません。<br> | |
92 | + * @param entityClass 対象エンティティクラス | |
93 | + * @param id レコードID | |
94 | + * @return エンティティオブジェクト | |
95 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#findById(java.lang.Class, java.lang.Integer) | |
96 | + */ | |
97 | + @Override | |
98 | + public <C extends AbstractHibernateEntity> C findById(Class<C> entityClass, Integer id) { | |
99 | + return super.findById(entityClass, id); | |
100 | + } | |
101 | + | |
102 | + /** | |
103 | + * データベースに登録されている全てのエンティティレコードを取得します。<br> | |
104 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
105 | + * @param entityClass 対象エンティティクラス | |
106 | + * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 | |
107 | + * @param orders ソート条件オブジェクト | |
108 | + * @return エンティティレコードリスト | |
109 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#findAll(java.lang.Class, boolean, java.util.List) | |
110 | + */ | |
111 | + @Override | |
112 | + public <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass, boolean includeDeleted, List<Order> orders) { | |
113 | + return super.findAll(entityClass, includeDeleted, orders); | |
114 | + } | |
115 | + | |
116 | + /** | |
117 | + * データベースに登録されている全ての未削除エンティティレコードを取得します。<br> | |
118 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
119 | + * @param entityClass 対象エンティティクラス | |
120 | + * @param orders ソート条件オブジェクト | |
121 | + * @return エンティティレコードリスト | |
122 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#findAll(java.lang.Class, java.util.List) | |
123 | + */ | |
124 | + @Override | |
125 | + public <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass, List<Order> orders) { | |
126 | + return super.findAll(entityClass, orders); | |
127 | + } | |
128 | + | |
129 | + /** | |
130 | + * データベースに登録されている全てのエンティティレコードを取得します。<br> | |
131 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
132 | + * @param entityClass 対象エンティティクラス | |
133 | + * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 | |
134 | + * @return エンティティレコードリスト | |
135 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#findAll(java.lang.Class, boolean) | |
136 | + */ | |
137 | + @Override | |
138 | + <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass, boolean includeDeleted) { | |
139 | + return super.findAll(entityClass, includeDeleted); | |
140 | + } | |
141 | + | |
142 | + /** | |
143 | + * データベースに登録されている全ての未削除エンティティレコードを取得します。<br> | |
144 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
145 | + * @param entityClass 対象エンティティクラス | |
146 | + * @return エンティティレコードリスト | |
147 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#findAll(java.lang.Class) | |
148 | + */ | |
149 | + @Override | |
150 | + public <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass) { | |
151 | + return super.findAll(entityClass); | |
152 | + } | |
153 | + | |
154 | + /** | |
155 | + * データベースに登録されているエンティティレコード数を取得します。<br> | |
156 | + * @param entityClass 対象エンティティクラス | |
157 | + * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 | |
158 | + * @return エンティティレコード数 | |
159 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#countAll(java.lang.Class, boolean) | |
160 | + */ | |
161 | + @Override | |
162 | + public <C extends AbstractHibernateEntity> long countAll(Class<C> entityClass, boolean includeDeleted) { | |
163 | + return super.countAll(entityClass, includeDeleted); | |
164 | + } | |
165 | + | |
166 | + /** | |
167 | + * データベースに登録されている未削除のエンティティレコード数を取得します。<br> | |
168 | + * @param entityClass 対象エンティティクラス | |
169 | + * @return エンティティレコード数 | |
170 | + * @see org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO#countAll(java.lang.Class) | |
171 | + */ | |
172 | + @Override | |
173 | + public <C extends AbstractHibernateEntity> long countAll(Class<C> entityClass) { | |
174 | + return super.countAll(entityClass); | |
175 | + } | |
176 | +} |
@@ -47,7 +47,7 @@ | ||
47 | 47 | * @param clazz データベースアクセスオブジェクトクラス |
48 | 48 | * @return クラスインスタンス |
49 | 49 | */ |
50 | - protected final <E extends AbstractHibernateEntity, D extends AbstractHibernateDAO<E>> D createDAO(Class<D> clazz) { | |
50 | + protected final <D extends AbstractHibernateDAO> D createDAO(Class<D> clazz) { | |
51 | 51 | try { |
52 | 52 | Constructor<D> constructor = clazz.getConstructor(new Class[] { HibernateTransactionManager.class }); |
53 | 53 | D instance = constructor.newInstance(new Object[] { getTransactionContext().getTransaction() }); |
@@ -105,15 +105,18 @@ | ||
105 | 105 | */ |
106 | 106 | protected final void save(AbstractHibernateEntity entity) { |
107 | 107 | if (entity != null) { |
108 | - if (entity.getEntryDate() == null) { | |
109 | - entity.setEntryUser(getTransactionContext().getProcessUser()); | |
110 | - entity.setEntryDate(getTransactionContext().getProcessDate()); | |
108 | + if (entity instanceof AbstractHibernateDefaultEntity) { | |
109 | + AbstractHibernateDefaultEntity defaultEntity = (AbstractHibernateDefaultEntity) entity; | |
110 | + if (defaultEntity.getEntryDate() == null) { | |
111 | + defaultEntity.setEntryUser(getTransactionContext().getProcessUser()); | |
112 | + defaultEntity.setEntryDate(getTransactionContext().getProcessDate()); | |
113 | + } | |
114 | + defaultEntity.setEntryDate(getTransactionContext().getProcessDate()); | |
115 | + defaultEntity.setModifyUser(getTransactionContext().getProcessUser()); | |
116 | + defaultEntity.setModifyDate(getTransactionContext().getProcessDate()); | |
117 | + //defaultEntity.setDeleteType(DeleteType.VALIDATE); | |
118 | + defaultEntity.setDeleteType(SCodeManager.getCode("S0001", "0")); | |
111 | 119 | } |
112 | - entity.setEntryDate(getTransactionContext().getProcessDate()); | |
113 | - entity.setModifyUser(getTransactionContext().getProcessUser()); | |
114 | - entity.setModifyDate(getTransactionContext().getProcessDate()); | |
115 | - //entity.setDeleteType(DeleteType.VALIDATE); | |
116 | - entity.setDeleteType(SCodeManager.getCode("S0001", "0")); | |
117 | 120 | entity.validate(); |
118 | 121 | getTransactionContext().getTransaction().getSession().saveOrUpdate(entity); |
119 | 122 | } |
@@ -137,16 +140,19 @@ | ||
137 | 140 | */ |
138 | 141 | protected final void delete(AbstractHibernateEntity entity) { |
139 | 142 | if (entity != null) { |
140 | - if (entity.getEntryDate() == null) { | |
141 | - entity.setEntryUser(getTransactionContext().getProcessUser()); | |
142 | - entity.setEntryDate(getTransactionContext().getProcessDate()); | |
143 | + if (entity instanceof AbstractHibernateDefaultEntity) { | |
144 | + AbstractHibernateDefaultEntity defaultEntity = (AbstractHibernateDefaultEntity) entity; | |
145 | + if (defaultEntity.getEntryDate() == null) { | |
146 | + defaultEntity.setEntryUser(getTransactionContext().getProcessUser()); | |
147 | + defaultEntity.setEntryDate(getTransactionContext().getProcessDate()); | |
148 | + } | |
149 | + defaultEntity.setModifyUser(getTransactionContext().getProcessUser()); | |
150 | + defaultEntity.setModifyDate(getTransactionContext().getProcessDate()); | |
151 | + defaultEntity.setDeleteUser(getTransactionContext().getProcessUser()); | |
152 | + defaultEntity.setDeleteDate(getTransactionContext().getProcessDate()); | |
153 | + //defaultEntity.setDeleteType(DeleteType.DELETED); | |
154 | + defaultEntity.setDeleteType(SCodeManager.getCode("S0001", "1")); | |
143 | 155 | } |
144 | - entity.setModifyUser(getTransactionContext().getProcessUser()); | |
145 | - entity.setModifyDate(getTransactionContext().getProcessDate()); | |
146 | - entity.setDeleteUser(getTransactionContext().getProcessUser()); | |
147 | - entity.setDeleteDate(getTransactionContext().getProcessDate()); | |
148 | - //entity.setDeleteType(DeleteType.DELETED); | |
149 | - entity.setDeleteType(SCodeManager.getCode("S0001", "1")); | |
150 | 156 | entity.validate(); |
151 | 157 | getTransactionContext().getTransaction().getSession().saveOrUpdate(entity); |
152 | 158 | } |
@@ -168,7 +174,7 @@ | ||
168 | 174 | * エンティティを物理削除します。<br> |
169 | 175 | * @param entity エンティティオブジェクト |
170 | 176 | */ |
171 | - protected final void erase(AbstractHibernateEntity entity) { | |
177 | + protected final void remove(AbstractHibernateEntity entity) { | |
172 | 178 | if (entity != null) { |
173 | 179 | getTransactionContext().getTransaction().getSession().delete(entity); |
174 | 180 | } |
@@ -178,10 +184,10 @@ | ||
178 | 184 | * エンティティを論理削除します。<br> |
179 | 185 | * @param entities エンティティオブジェクト |
180 | 186 | */ |
181 | - protected final <E extends AbstractHibernateEntity> void erase(List<E> entities) { | |
187 | + protected final <E extends AbstractHibernateEntity> void remove(List<E> entities) { | |
182 | 188 | if (entities != null) { |
183 | 189 | for (AbstractHibernateEntity entity : entities) { |
184 | - delete(entity); | |
190 | + remove(entity); | |
185 | 191 | } |
186 | 192 | } |
187 | 193 | } |
@@ -0,0 +1,161 @@ | ||
1 | +package org.phosphoresce.webcore.ext.hibernate4.transaction; | |
2 | + | |
3 | +import java.util.List; | |
4 | + | |
5 | +import org.hibernate.Query; | |
6 | +import org.hibernate.SQLQuery; | |
7 | +import org.hibernate.criterion.Order; | |
8 | +import org.phosphoresce.lib.commons.util.AnnotationUtil; | |
9 | +import org.phosphoresce.webcore.ext.hibernate4.annotation.HibernateDAO; | |
10 | +import org.phosphoresce.webcore.ext.hibernate4.exception.HibernateTransactionException; | |
11 | + | |
12 | +/** | |
13 | + * Hibernateによるデータベースアクセス処理クラスの共通的なインタフェースを提供します。<br> | |
14 | + * <p> | |
15 | + * すべてのHibernateデータベースアクセスオブジェクトクラスはこのクラスを継承して実装します。<br> | |
16 | + * また、データベースアクセスオブジェクトクラスは必ずクラスアノテーションに{@link HibernateDAO}を付与し、対象のエンティティを決定する必要があります。<br> | |
17 | + * {@link HibernateDAO#entity()}で指定するエンティティクラスは必ず、このクラスジェネリクスに指定するエンティティクラスに一致させる必要があります。<br> | |
18 | + * </p> | |
19 | + * | |
20 | + * @param <E> データベースアクセス対象エンティティクラス | |
21 | + * | |
22 | + * @author Kitagawa<br> | |
23 | + * | |
24 | + *<!-- | |
25 | + * 更新日 更新者 更新内容 | |
26 | + * 2013/02/01 Kitagawa 新規作成 | |
27 | + * 2013/07/21 Kitagawa 対象エンティティクラス取得をフックメソッドからアノテーションに変更 | |
28 | + * 2013/07/31 Kitagawa 汎用インタフェースを追加({@link #findAll(boolean)}、{@link #countAll(boolean)}) | |
29 | + * 2013/08/06 Kitagawa 総称型で指定したエンティティクラス以外のCriteriaを生成する汎用インタフェースを追加 | |
30 | + * 2013/08/13 Kitagawa クラス総称型指定のない汎用クラス{@link AbstractHibernateDAO}と分離 | |
31 | + *--> | |
32 | + */ | |
33 | +public abstract class AbstractGenericHibernateDAO<E extends AbstractHibernateEntity> extends AbstractHibernateDAO { | |
34 | + | |
35 | + /** | |
36 | + * コンストラクタ<br> | |
37 | + * @param transaction トランザクション管理オブジェクト | |
38 | + */ | |
39 | + protected AbstractGenericHibernateDAO(HibernateTransactionManager transaction) { | |
40 | + super(transaction); | |
41 | + } | |
42 | + | |
43 | + /** | |
44 | + * DAOクラスで対象とされているエンティティクラスを取得します。<br> | |
45 | + * @return エンティティクラス | |
46 | + */ | |
47 | + @SuppressWarnings("unchecked") | |
48 | + private Class<E> getEntityClass() { | |
49 | + HibernateDAO hibernateDAO = AnnotationUtil.getClassAnnotation(HibernateDAO.class, getClass()); | |
50 | + if (hibernateDAO == null) { | |
51 | + throw new HibernateTransactionException("FHBN00025", new Object[] { getClass().getName() }); | |
52 | + } | |
53 | + return (Class<E>) hibernateDAO.entity(); | |
54 | + } | |
55 | + | |
56 | + /** | |
57 | + * データベースクエリ条件オブジェクトを生成します。<br> | |
58 | + * @return データベースクエリ条件オブジェクト | |
59 | + */ | |
60 | + protected final GenericCriteria<E> createCriteria() { | |
61 | + return super.createCriteria(getEntityClass()); | |
62 | + } | |
63 | + | |
64 | + /** | |
65 | + * データベースクエリ条件オブジェクトを生成します。<br> | |
66 | + * 対象エンティティが削除状態を保持するエンティティの場合、削除状態のエンティティを除外する条件を持ちます。<br> | |
67 | + * @return データベースクエリ条件オブジェクト | |
68 | + */ | |
69 | + protected final GenericCriteria<E> createCriteriaExcludeDeleted() { | |
70 | + return super.createCriteriaExcludeDeleted(getEntityClass()); | |
71 | + } | |
72 | + | |
73 | + /** | |
74 | + * SQLデータベースクエリを生成します。<br> | |
75 | + * DAOクラスにおいて当インタフェースを利用した場合、総称型で指定されたエンティティクラスで制限がかからないクエリとなることに注意して下さい。<br> | |
76 | + * これは利用者がDAOクラスの位置づけ(エンティティ対応しているDAO)に注意して利用する必要があり、場合によってはアプリケーション開発規約で利用禁止とすることも検討して下さい。<br> | |
77 | + * @param sql SQLデータベースクエリ | |
78 | + * @return SQLデータベースクエリオブジェクト | |
79 | + */ | |
80 | + protected final SQLQuery createSQLQuery(String sql) { | |
81 | + return super.createSQLQuery(sql); | |
82 | + } | |
83 | + | |
84 | + /** | |
85 | + * HQLデータベースクエリを生成します。<br> | |
86 | + * DAOクラスにおいて当インタフェースを利用した場合、総称型で指定されたエンティティクラスで制限がかからないクエリとなることに注意して下さい。<br> | |
87 | + * これは利用者がDAOクラスの位置づけ(エンティティ対応しているDAO)に注意して利用する必要があり、場合によってはアプリケーション開発規約で利用禁止とすることも検討して下さい。<br> | |
88 | + * @param hql HQLデータベースクエリ | |
89 | + * @return HQLデータベースクエリオブジェクト | |
90 | + */ | |
91 | + protected final Query createHQLQuery(String hql) { | |
92 | + return super.createHQLQuery(hql); | |
93 | + } | |
94 | + | |
95 | + /** | |
96 | + * 指定されたレコードIDでエンティティを検索します。<br> | |
97 | + * 当インタフェースは削除済の条件は加味されません。<br> | |
98 | + * @param id レコードID | |
99 | + * @return エンティティオブジェクト | |
100 | + */ | |
101 | + public final E findById(Integer id) { | |
102 | + return super.findById(getEntityClass(), id); | |
103 | + } | |
104 | + | |
105 | + /** | |
106 | + * データベースに登録されている全てのエンティティレコードを取得します。<br> | |
107 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
108 | + * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 | |
109 | + * @param orders ソート条件オブジェクト | |
110 | + * @return エンティティレコードリスト | |
111 | + */ | |
112 | + public final List<E> findAll(boolean includeDeleted, List<Order> orders) { | |
113 | + return super.findAll(getEntityClass(), includeDeleted, orders); | |
114 | + } | |
115 | + | |
116 | + /** | |
117 | + * データベースに登録されている全ての未削除エンティティレコードを取得します。<br> | |
118 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
119 | + * @param orders ソート条件オブジェクト | |
120 | + * @return エンティティレコードリスト | |
121 | + */ | |
122 | + public final List<E> findAll(List<Order> orders) { | |
123 | + return super.findAll(getEntityClass(), false, orders); | |
124 | + } | |
125 | + | |
126 | + /** | |
127 | + * データベースに登録されている全てのエンティティレコードを取得します。<br> | |
128 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
129 | + * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 | |
130 | + * @return エンティティレコードリスト | |
131 | + */ | |
132 | + public final List<E> findAll(boolean includeDeleted) { | |
133 | + return super.findAll(getEntityClass(), includeDeleted, null); | |
134 | + } | |
135 | + | |
136 | + /** | |
137 | + * データベースに登録されている全ての未削除エンティティレコードを取得します。<br> | |
138 | + * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 | |
139 | + * @return エンティティレコードリスト | |
140 | + */ | |
141 | + public final List<E> findAll() { | |
142 | + return super.findAll(getEntityClass(), false); | |
143 | + } | |
144 | + | |
145 | + /** | |
146 | + * データベースに登録されているエンティティレコード数を取得します。<br> | |
147 | + * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 | |
148 | + * @return エンティティレコード数 | |
149 | + */ | |
150 | + public final long countAll(boolean includeDeleted) { | |
151 | + return super.countAll(getEntityClass(), includeDeleted); | |
152 | + } | |
153 | + | |
154 | + /** | |
155 | + * データベースに登録されている未削除のエンティティレコード数を取得します。<br> | |
156 | + * @return エンティティレコード数 | |
157 | + */ | |
158 | + public final long countAll() { | |
159 | + return super.countAll(getEntityClass(), false); | |
160 | + } | |
161 | +} |
@@ -0,0 +1,198 @@ | ||
1 | +package org.phosphoresce.webcore.ext.hibernate4.transaction; | |
2 | + | |
3 | +import java.util.Date; | |
4 | + | |
5 | +import javax.persistence.Column; | |
6 | +import javax.persistence.JoinColumn; | |
7 | +import javax.persistence.ManyToOne; | |
8 | +import javax.persistence.MappedSuperclass; | |
9 | + | |
10 | +import org.hibernate.annotations.JoinColumnOrFormula; | |
11 | +import org.hibernate.annotations.JoinColumnsOrFormulas; | |
12 | +import org.hibernate.annotations.JoinFormula; | |
13 | +import org.hibernate.annotations.Where; | |
14 | +import org.phosphoresce.webcore.ext.hibernate4.model.SCode; | |
15 | +import org.phosphoresce.webcore.ext.hibernate4.model.SUser; | |
16 | + | |
17 | +/** | |
18 | + * 通常のアプリケーションデータベーステーブルエンティティの共通カラムフィールドインタフェースを提供します。<br> | |
19 | + * <p> | |
20 | + * Hibernateアドオンモジュールを利用したアプリケーションで利用する通常のエンティティはすべてこのクラスが継承されて提供されます。<br> | |
21 | + * これはすべてのエンティティはレコードID、レコードバージョン番号及び、登録日時、登録者情報が必ず管理されることを意味します。<br> | |
22 | + * また、これらのアクセッサインタフェースはユーザーからの利用ではGetterインタフェースのみ提供され、Setterインタフェースはアドオンモジュール側で制御するのみに制限されます。<br> | |
23 | + * </p> | |
24 | + * | |
25 | + * @author Kitagawa<br> | |
26 | + * | |
27 | + *<!-- | |
28 | + * 更新日 更新者 更新内容 | |
29 | + * 2013/02/01 Kitagawa 新規作成 | |
30 | + *--> | |
31 | + */ | |
32 | +@MappedSuperclass | |
33 | +public abstract class AbstractHibernateDefaultEntity extends AbstractHibernateEntity { | |
34 | + | |
35 | + /** 登録日時 */ | |
36 | + @Column(name = "entry_date") | |
37 | + private Date entryDate; | |
38 | + | |
39 | + /** 登録ユーザ */ | |
40 | + @ManyToOne | |
41 | + @JoinColumn(name = "entry_user", referencedColumnName = "code") | |
42 | + @Where(clause = "delete_type = '0'") | |
43 | + private SUser entryUser; | |
44 | + | |
45 | + /** 更新日時 */ | |
46 | + @Column(name = "modify_date") | |
47 | + private Date modifyDate; | |
48 | + | |
49 | + /** 更新ユーザ */ | |
50 | + @ManyToOne | |
51 | + @JoinColumn(name = "modify_user", referencedColumnName = "code") | |
52 | + @Where(clause = "delete_type = '0'") | |
53 | + private SUser modifyUser; | |
54 | + | |
55 | + /** 削除日時 */ | |
56 | + @Column(name = "delete_date") | |
57 | + private Date deleteDate; | |
58 | + | |
59 | + /** 削除ユーザ */ | |
60 | + @ManyToOne | |
61 | + @JoinColumn(name = "delete_user", referencedColumnName = "code") | |
62 | + @Where(clause = "delete_type = '0'") | |
63 | + private SUser deleteUser; | |
64 | + | |
65 | + /** 削除状態 */ | |
66 | + @ManyToOne | |
67 | + //@JoinFormula(referencedColumnName = "code", value = "(select s_code.code from s_code where s_code.category = 'S0001' and s_code.code = delete_type)") | |
68 | + @JoinColumnsOrFormulas({ // | |
69 | + @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "category", value = "'S0001'")), // | |
70 | + @JoinColumnOrFormula(column = @JoinColumn(referencedColumnName = "code", name = "delete_type", nullable = false)) // | |
71 | + }) | |
72 | + private SCode deleteType; | |
73 | + | |
74 | + /** | |
75 | + * データベース登録処理前のエンティティ内容の整合処理を実施します。<br> | |
76 | + */ | |
77 | + void validate() { | |
78 | + validateEntity(); | |
79 | + } | |
80 | + | |
81 | + /** | |
82 | + * データベース登録処理前のエンティティ内容の整合処理を実施します。<br> | |
83 | + * 当処理はエンティティ毎に処理が異なります。<br> | |
84 | + */ | |
85 | + protected abstract void validateEntity(); | |
86 | + | |
87 | + /** | |
88 | + * 登録日時を取得します。<br> | |
89 | + * @return 登録日時 | |
90 | + */ | |
91 | + public final Date getEntryDate() { | |
92 | + return entryDate; | |
93 | + } | |
94 | + | |
95 | + /** | |
96 | + * 登録日時を設定します。<br> | |
97 | + * @param entryDate 登録日時 | |
98 | + */ | |
99 | + final void setEntryDate(Date entryDate) { | |
100 | + this.entryDate = entryDate; | |
101 | + } | |
102 | + | |
103 | + /** | |
104 | + * 登録ユーザを取得します。<br> | |
105 | + * @return 登録ユーザ | |
106 | + */ | |
107 | + public SUser getEntryUser() { | |
108 | + return entryUser; | |
109 | + } | |
110 | + | |
111 | + /** | |
112 | + * 登録ユーザを設定します。<br> | |
113 | + * @param entryUser 登録ユーザ | |
114 | + */ | |
115 | + void setEntryUser(SUser entryUser) { | |
116 | + this.entryUser = entryUser; | |
117 | + } | |
118 | + | |
119 | + /** | |
120 | + * 更新日時を取得します。<br> | |
121 | + * @return 更新日時 | |
122 | + */ | |
123 | + public final Date getModifyDate() { | |
124 | + return modifyDate; | |
125 | + } | |
126 | + | |
127 | + /** | |
128 | + * 更新日時を設定します。<br> | |
129 | + * @param modifyDate 更新日時 | |
130 | + */ | |
131 | + final void setModifyDate(Date modifyDate) { | |
132 | + this.modifyDate = modifyDate; | |
133 | + } | |
134 | + | |
135 | + /** | |
136 | + * 更新ユーザを取得します。<br> | |
137 | + * @return 更新ユーザ | |
138 | + */ | |
139 | + public SUser getModifyUser() { | |
140 | + return modifyUser; | |
141 | + } | |
142 | + | |
143 | + /** | |
144 | + * 更新ユーザを設定します。<br> | |
145 | + * @param modifyUser 更新ユーザ | |
146 | + */ | |
147 | + void setModifyUser(SUser modifyUser) { | |
148 | + this.modifyUser = modifyUser; | |
149 | + } | |
150 | + | |
151 | + /** | |
152 | + * 削除日時を取得します。<br> | |
153 | + * @return 削除日時 | |
154 | + */ | |
155 | + public final Date getDeleteDate() { | |
156 | + return deleteDate; | |
157 | + } | |
158 | + | |
159 | + /** | |
160 | + * 削除日時を設定します。<br> | |
161 | + * @param deleteDate 削除日時 | |
162 | + */ | |
163 | + final void setDeleteDate(Date deleteDate) { | |
164 | + this.deleteDate = deleteDate; | |
165 | + } | |
166 | + | |
167 | + /** | |
168 | + * 削除ユーザを取得します。<br> | |
169 | + * @return 削除ユーザ | |
170 | + */ | |
171 | + public SUser getDeleteUser() { | |
172 | + return deleteUser; | |
173 | + } | |
174 | + | |
175 | + /** | |
176 | + * 削除ユーザを設定します。<br> | |
177 | + * @param deleteUser 削除ユーザ | |
178 | + */ | |
179 | + public void setDeleteUser(SUser deleteUser) { | |
180 | + this.deleteUser = deleteUser; | |
181 | + } | |
182 | + | |
183 | + /** | |
184 | + * 削除状態を取得します。<br> | |
185 | + * @return 削除状態 | |
186 | + */ | |
187 | + public SCode getDeleteType() { | |
188 | + return deleteType; | |
189 | + } | |
190 | + | |
191 | + /** | |
192 | + * 削除状態を設定します。<br> | |
193 | + * @param deleteType 削除状態 | |
194 | + */ | |
195 | + public void setDeleteType(SCode deleteType) { | |
196 | + this.deleteType = deleteType; | |
197 | + } | |
198 | +} |
@@ -5,18 +5,19 @@ | ||
5 | 5 | import java.util.List; |
6 | 6 | |
7 | 7 | import org.hibernate.Criteria; |
8 | -import org.hibernate.criterion.Criterion; | |
8 | +import org.hibernate.Query; | |
9 | +import org.hibernate.SQLQuery; | |
10 | +import org.hibernate.Session; | |
9 | 11 | import org.hibernate.criterion.Order; |
10 | -import org.phosphoresce.lib.commons.util.AnnotationUtil; | |
11 | -import org.phosphoresce.webcore.ext.hibernate4.annotation.HibernateDAO; | |
12 | -import org.phosphoresce.webcore.ext.hibernate4.exception.HibernateTransactionException; | |
12 | +import org.phosphoresce.lib.commons.util.ReflectionUtil; | |
13 | +import org.phosphoresce.webcore.ext.hibernate4.util.SCodeManager; | |
13 | 14 | |
14 | 15 | /** |
15 | - * Hibernateによるデータベースアクセス処理クラスの共通的なインタフェースを提供します。<br> | |
16 | + * 任意のエンティティに対するHibernateデータベースアクセス処理クラスの共通的なインタフェースを提供します。<br> | |
16 | 17 | * <p> |
17 | - * すべてのHibernateデータベースアクセスオブジェクトクラスはこのクラスを継承して実装します。<br> | |
18 | - * また、データベースアクセスオブジェクトクラスは必ずクラスアノテーションに{@link HibernateDAO}を付与し、対象のエンティティを決定する必要があります。<br> | |
19 | - * {@link HibernateDAO#entity()}で指定するエンティティクラスは必ず、このクラスジェネリクスに指定するエンティティクラスに一致させる必要があります。<br> | |
18 | + * このクラスが提供するインタフェースはそれぞれのメソッドで利用するエンティティクラスを指定します。<br> | |
19 | + * アプリケーション開発時に作成するデータベースアクセスオブジェクトはこのクラスではなく、{@link AbstractGenericHibernateDAO}を継承して作成します。<br> | |
20 | + * このクラスは、汎用的なデータベースアクセスオブジェクトを作成する際に、総称型によるエンティティ制限を設けることが出来ない為に設けられました。<br> | |
20 | 21 | * </p> |
21 | 22 | * |
22 | 23 | * @param <E> データベースアクセス対象エンティティクラス |
@@ -25,24 +26,19 @@ | ||
25 | 26 | * |
26 | 27 | *<!-- |
27 | 28 | * 更新日 更新者 更新内容 |
28 | - * 2013/02/01 Kitagawa 新規作成 | |
29 | - * 2013/07/21 Kitagawa 対象エンティティクラス取得をフックメソッドからアノテーションに変更 | |
30 | - * 2013/07/31 Kitagawa 汎用インタフェースを追加({@link #findAll(boolean)}、{@link #countAll(boolean)}) | |
29 | + * 2013/08/16 Kitagawa 新規作成 | |
31 | 30 | *--> |
32 | 31 | */ |
33 | -public abstract class AbstractHibernateDAO<E extends AbstractHibernateEntity> { | |
32 | +abstract class AbstractHibernateDAO { | |
34 | 33 | |
35 | - /** エンティティカラム名(削除ユーザ) */ | |
36 | - public static final String COLUMN_DELETE_USER = "deleteUser"; | |
37 | - | |
38 | 34 | /** トランザクション管理オブジェクト */ |
39 | - private HibernateTransactionManager transaction; | |
35 | + HibernateTransactionManager transaction; | |
40 | 36 | |
41 | 37 | /** |
42 | 38 | * コンストラクタ<br> |
43 | 39 | * @param transaction トランザクション管理オブジェクト |
44 | 40 | */ |
45 | - protected AbstractHibernateDAO(HibernateTransactionManager transaction) { | |
41 | + AbstractHibernateDAO(HibernateTransactionManager transaction) { | |
46 | 42 | if (transaction == null) { |
47 | 43 | throw new NullPointerException(); |
48 | 44 | } |
@@ -51,36 +47,60 @@ | ||
51 | 47 | |
52 | 48 | /** |
53 | 49 | * データベースクエリ条件オブジェクトを生成します。<br> |
50 | + * @param entityClass 対象エンティティクラス | |
54 | 51 | * @return データベースクエリ条件オブジェクト |
55 | 52 | */ |
56 | - protected final GenericCriteria<E> createCriteria() { | |
57 | - HibernateDAO hibernateDAO = AnnotationUtil.getClassAnnotation(HibernateDAO.class, getClass()); | |
58 | - if (hibernateDAO == null) { | |
59 | - throw new HibernateTransactionException("FHBN00025", new Object[] { getClass().getName() }); | |
60 | - } | |
61 | - Class<? extends AbstractHibernateEntity> entityClass = hibernateDAO.entity(); | |
62 | - Criteria criteria = transaction.getSession().createCriteria(entityClass); | |
63 | - return new GenericCriteria<E>(criteria); | |
53 | + <C extends AbstractHibernateEntity> GenericCriteria<C> createCriteria(Class<C> entityClass) { | |
54 | + Session session = transaction.getSession(); | |
55 | + Criteria criteria = session.createCriteria(entityClass); | |
56 | + return new GenericCriteria<C>(criteria); | |
64 | 57 | } |
65 | 58 | |
66 | 59 | /** |
67 | 60 | * データベースクエリ条件オブジェクトを生成します。<br> |
61 | + * 対象エンティティが削除状態を保持するエンティティの場合、削除状態のエンティティを除外する条件を持ちます。<br> | |
62 | + * @param entityClass 対象エンティティクラス | |
68 | 63 | * @return データベースクエリ条件オブジェクト |
69 | 64 | */ |
70 | - protected final GenericCriteria<E> createCriteriaExcludeDeleted() { | |
71 | - GenericCriteria<E> criteria = createCriteria(); | |
72 | - criteria.add(isNull(COLUMN_DELETE_USER)); | |
65 | + <C extends AbstractHibernateEntity> GenericCriteria<C> createCriteriaExcludeDeleted(Class<C> entityClass) { | |
66 | + GenericCriteria<C> criteria = createCriteria(entityClass); | |
67 | + if (ReflectionUtil.getSuperclasses(entityClass).contains(AbstractHibernateDefaultEntity.class)) { | |
68 | + criteria.add(ne("deleteType", SCodeManager.getCode("S0001", "1"))); | |
69 | + } | |
73 | 70 | return criteria; |
74 | 71 | } |
75 | 72 | |
76 | 73 | /** |
74 | + * SQLデータベースクエリを生成します。<br> | |
75 | + * DAOクラスにおいて当インタフェースを利用した場合、エンティティクラスで制限がかからないクエリとなることに注意して下さい。<br> | |
76 | + * これは利用者がDAOクラスの位置づけ(エンティティ対応しているDAO)に注意して利用する必要があり、場合によってはアプリケーション開発規約で利用禁止とすることも検討して下さい。<br> | |
77 | + * @param sql SQLデータベースクエリ | |
78 | + * @return SQLデータベースクエリオブジェクト | |
79 | + */ | |
80 | + SQLQuery createSQLQuery(String sql) { | |
81 | + return transaction.getSession().createSQLQuery(sql); | |
82 | + } | |
83 | + | |
84 | + /** | |
85 | + * HQLデータベースクエリを生成します。<br> | |
86 | + * DAOクラスにおいて当インタフェースを利用した場合、エンティティクラスで制限がかからないクエリとなることに注意して下さい。<br> | |
87 | + * これは利用者がDAOクラスの位置づけ(エンティティ対応しているDAO)に注意して利用する必要があり、場合によってはアプリケーション開発規約で利用禁止とすることも検討して下さい。<br> | |
88 | + * @param hql HQLデータベースクエリ | |
89 | + * @return HQLデータベースクエリオブジェクト | |
90 | + */ | |
91 | + Query createHQLQuery(String hql) { | |
92 | + return transaction.getSession().createQuery(hql); | |
93 | + } | |
94 | + | |
95 | + /** | |
77 | 96 | * 指定されたレコードIDでエンティティを検索します。<br> |
78 | 97 | * 当インタフェースは削除済の条件は加味されません。<br> |
98 | + * @param entityClass 対象エンティティクラス | |
79 | 99 | * @param id レコードID |
80 | 100 | * @return エンティティオブジェクト |
81 | 101 | */ |
82 | - public final E findById(Integer id) { | |
83 | - GenericCriteria<E> criteria = createCriteria(); | |
102 | + <C extends AbstractHibernateEntity> C findById(Class<C> entityClass, Integer id) { | |
103 | + GenericCriteria<C> criteria = createCriteria(entityClass); | |
84 | 104 | criteria.add(idEq(id)); |
85 | 105 | return criteria.uniqueResult(); |
86 | 106 | } |
@@ -88,16 +108,17 @@ | ||
88 | 108 | /** |
89 | 109 | * データベースに登録されている全てのエンティティレコードを取得します。<br> |
90 | 110 | * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 |
111 | + * @param entityClass 対象エンティティクラス | |
91 | 112 | * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 |
92 | 113 | * @param orders ソート条件オブジェクト |
93 | 114 | * @return エンティティレコードリスト |
94 | 115 | */ |
95 | - public final List<E> findAll(boolean includeDeleted, List<Order> orders) { | |
96 | - GenericCriteria<E> criteria = null; | |
116 | + <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass, boolean includeDeleted, List<Order> orders) { | |
117 | + GenericCriteria<C> criteria = null; | |
97 | 118 | if (includeDeleted) { |
98 | - criteria = createCriteria(); | |
119 | + criteria = createCriteria(entityClass); | |
99 | 120 | } else { |
100 | - criteria = createCriteriaExcludeDeleted(); | |
121 | + criteria = createCriteriaExcludeDeleted(entityClass); | |
101 | 122 | } |
102 | 123 | if (orders != null) { |
103 | 124 | for (Order order : orders) { |
@@ -110,69 +131,47 @@ | ||
110 | 131 | /** |
111 | 132 | * データベースに登録されている全ての未削除エンティティレコードを取得します。<br> |
112 | 133 | * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 |
134 | + * @param entityClass 対象エンティティクラス | |
113 | 135 | * @param orders ソート条件オブジェクト |
114 | 136 | * @return エンティティレコードリスト |
115 | 137 | */ |
116 | - public final List<E> findAll(List<Order> orders) { | |
117 | - return findAll(false, orders); | |
138 | + <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass, List<Order> orders) { | |
139 | + return findAll(entityClass, false, orders); | |
118 | 140 | } |
119 | 141 | |
120 | 142 | /** |
121 | 143 | * データベースに登録されている全てのエンティティレコードを取得します。<br> |
122 | 144 | * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 |
145 | + * @param entityClass 対象エンティティクラス | |
123 | 146 | * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 |
124 | 147 | * @return エンティティレコードリスト |
125 | 148 | */ |
126 | - public final List<E> findAll(boolean includeDeleted) { | |
127 | - return findAll(includeDeleted, null); | |
149 | + <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass, boolean includeDeleted) { | |
150 | + return findAll(entityClass, includeDeleted, null); | |
128 | 151 | } |
129 | 152 | |
130 | 153 | /** |
131 | 154 | * データベースに登録されている全ての未削除エンティティレコードを取得します。<br> |
132 | 155 | * マスタデータ等で利用されることはありますが、通常のトランザクションデータ等では利用されることは想定されません。 |
156 | + * @param entityClass 対象エンティティクラス | |
133 | 157 | * @return エンティティレコードリスト |
134 | 158 | */ |
135 | - public final List<E> findAll() { | |
136 | - return findAll(false); | |
159 | + <C extends AbstractHibernateEntity> List<C> findAll(Class<C> entityClass) { | |
160 | + return findAll(entityClass, false); | |
137 | 161 | } |
138 | 162 | |
139 | 163 | /** |
140 | - * 指定された検索条件及び、ソート条件に合致するエンティティを検索します。<br> | |
141 | - * 当インタフェースは削除済の条件は加味されません。<br> | |
142 | - * 当インタフェースはDAOより上位レイヤから利用可能とした場合、DAOレイヤとサービスレイヤとのスコープ定義が曖昧になります。<br> | |
143 | - * 但し、システム規模によってはサービスを機能単位で設けることが生産性向上につながる場合もある為、当メソッドはfinal属性を | |
144 | - * 持たないprotectedインタフェースとして設置されています。<br> | |
145 | - * これは各システムの共通DAOクラスでpublicレベルに昇格させることで、サービスレイヤからDAO処理が利用出来ることを表します。<br> | |
146 | - * @param criterions 検索条件 | |
147 | - * @param orders ソート条件オブジェクト | |
148 | - * @return エンティティオブジェクトリスト | |
149 | - */ | |
150 | - protected List<E> findByCriterions(List<Criterion> criterions, List<Order> orders) { | |
151 | - GenericCriteria<E> criteria = createCriteria(); | |
152 | - if (criterions != null) { | |
153 | - for (Criterion criterion : criterions) { | |
154 | - criteria.add(criterion); | |
155 | - } | |
156 | - } | |
157 | - if (orders != null) { | |
158 | - for (Order order : orders) { | |
159 | - criteria.addOrder(order); | |
160 | - } | |
161 | - } | |
162 | - return criteria.list(); | |
163 | - } | |
164 | - | |
165 | - /** | |
166 | 164 | * データベースに登録されているエンティティレコード数を取得します。<br> |
165 | + * @param entityClass 対象エンティティクラス | |
167 | 166 | * @param includeDeleted 論理削除済みデータを含める場合にtrueを指定 |
168 | 167 | * @return エンティティレコード数 |
169 | 168 | */ |
170 | - public final long countAll(boolean includeDeleted) { | |
171 | - GenericCriteria<E> criteria = null; | |
169 | + <C extends AbstractHibernateEntity> long countAll(Class<C> entityClass, boolean includeDeleted) { | |
170 | + GenericCriteria<C> criteria = null; | |
172 | 171 | if (includeDeleted) { |
173 | - criteria = createCriteria(); | |
172 | + criteria = createCriteria(entityClass); | |
174 | 173 | } else { |
175 | - criteria = createCriteriaExcludeDeleted(); | |
174 | + criteria = createCriteriaExcludeDeleted(entityClass); | |
176 | 175 | } |
177 | 176 | return criteria.count(); |
178 | 177 | } |
@@ -179,9 +178,10 @@ | ||
179 | 178 | |
180 | 179 | /** |
181 | 180 | * データベースに登録されている未削除のエンティティレコード数を取得します。<br> |
181 | + * @param entityClass 対象エンティティクラス | |
182 | 182 | * @return エンティティレコード数 |
183 | 183 | */ |
184 | - public final long countAll() { | |
185 | - return countAll(false); | |
184 | + <C extends AbstractHibernateEntity> long countAll(Class<C> entityClass) { | |
185 | + return countAll(entityClass, false); | |
186 | 186 | } |
187 | 187 | } |
@@ -20,7 +20,7 @@ | ||
20 | 20 | *--> |
21 | 21 | */ |
22 | 22 | @MappedSuperclass |
23 | -public abstract class AbstractHibernateExpirableEntity extends AbstractHibernateEntity { | |
23 | +public abstract class AbstractHibernateExpirableEntity extends AbstractHibernateDefaultEntity { | |
24 | 24 | |
25 | 25 | /** 有効期間開始 */ |
26 | 26 | @Column(name = "expiry_start", nullable = false) |
@@ -24,6 +24,12 @@ | ||
24 | 24 | /** Hibernate環境設定リソースパス定義 */ |
25 | 25 | public static final HibernateConfigName HIBERNATE_CONFIG = new HibernateConfigName("hibernate.config"); |
26 | 26 | |
27 | + /** コードマスタ定義Excel配置パス定義 */ | |
28 | + public static final HibernateConfigName HIBERNATE_CODEMASTER_PATH = new HibernateConfigName("hibernate.codemaster.path"); | |
29 | + | |
30 | + /** コードマスタ定義Excel配置パス定義 */ | |
31 | + public static final HibernateConfigName HIBERNATE_CODEMASTER_AUTOLOAD = new HibernateConfigName("hibernate.codemaster.autoload"); | |
32 | + | |
27 | 33 | /** Hibernateアノテーションモデル定義 */ |
28 | 34 | public static final HibernateConfigName HIBERNATE_ANNOTATION_CLASSES = new HibernateConfigName("hibernate.annotation.classes"); |
29 | 35 |
@@ -1,5 +1,7 @@ | ||
1 | 1 | package org.phosphoresce.webcore.ext.hibernate4; |
2 | 2 | |
3 | +import java.io.File; | |
4 | +import java.text.SimpleDateFormat; | |
3 | 5 | import java.util.Date; |
4 | 6 | import java.util.List; |
5 | 7 |
@@ -9,6 +11,9 @@ | ||
9 | 11 | import org.phosphoresce.lib.commons.util.PropertiesUtil; |
10 | 12 | import org.phosphoresce.lib.commons.util.StringUtil; |
11 | 13 | import org.phosphoresce.lib.jod.JODSOfficeProcessManager; |
14 | +import org.phosphoresce.lib.poi.PoiWorkbookType; | |
15 | +import org.phosphoresce.lib.poi.adapter.PoiSheet; | |
16 | +import org.phosphoresce.lib.poi.adapter.PoiWorkbook; | |
12 | 17 | import org.phosphoresce.webcore.core.GlobalEnvironment; |
13 | 18 | import org.phosphoresce.webcore.core.config.Config; |
14 | 19 | import org.phosphoresce.webcore.core.exception.WebcoreConfigurationException; |
@@ -15,6 +20,7 @@ | ||
15 | 20 | import org.phosphoresce.webcore.core.logger.CodeConvertLogger; |
16 | 21 | import org.phosphoresce.webcore.ext.hibernate4.exception.HibernateConfigureException; |
17 | 22 | import org.phosphoresce.webcore.ext.hibernate4.model.SCode; |
23 | +import org.phosphoresce.webcore.ext.hibernate4.model.SConfig; | |
18 | 24 | import org.phosphoresce.webcore.ext.hibernate4.model.SUser; |
19 | 25 | import org.phosphoresce.webcore.ext.hibernate4.service.SystemMasterService; |
20 | 26 | import org.phosphoresce.webcore.ext.hibernate4.transaction.HibernateTransactionContext; |
@@ -58,6 +64,7 @@ | ||
58 | 64 | log.output("FHBN00001"); |
59 | 65 | |
60 | 66 | configureEvironment(); |
67 | + configureSCodeAutoload(); | |
61 | 68 | configureSCodeManager(); |
62 | 69 | |
63 | 70 | log.output("FHBN00002"); |
@@ -131,6 +138,99 @@ | ||
131 | 138 | } |
132 | 139 | |
133 | 140 | /** |
141 | + * システムコードマスタの自動登録処理を行います。<br> | |
142 | + * @throws Throwable 処理中に予期せぬエラーが発生した場合にスローされます | |
143 | + */ | |
144 | + private synchronized static void configureSCodeAutoload() throws Throwable { | |
145 | + HibernateTransactionManager transaction = null; | |
146 | + HibernateTransactionContext<SUser> context = null; | |
147 | + SystemMasterService service = null; | |
148 | + | |
149 | + /* | |
150 | + * 自動ロード設定が行われていない場合は処理スキップ | |
151 | + */ | |
152 | + if (!Config.getBoolean(HibernateConfigName.HIBERNATE_CODEMASTER_AUTOLOAD)) { | |
153 | + log.output("FHBN00027"); | |
154 | + return; | |
155 | + } | |
156 | + | |
157 | + try { | |
158 | + transaction = new HibernateTransactionManager(); | |
159 | + context = new HibernateTransactionContext<SUser>(transaction, null, new Date()); | |
160 | + service = new SystemMasterService(context); | |
161 | + transaction.open(); | |
162 | + | |
163 | + /* | |
164 | + * 未登録又はExcelファイル更新日が新しい場合は登録を行う | |
165 | + */ | |
166 | + SConfig sConfig = service.getSConfigByProperty(SCONFIG_KEY_SCODE_LOAD_TIMESTAMP); | |
167 | + SimpleDateFormat timestampFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); | |
168 | + long excelTimestamp = new File(Config.getString(HibernateConfigName.HIBERNATE_CODEMASTER_PATH)).lastModified(); | |
169 | + boolean load = false; | |
170 | + if (sConfig == null) { | |
171 | + log.output("FHBN00029"); | |
172 | + load = true; | |
173 | + } else { | |
174 | + String lastmodified = sConfig.getValue1(); | |
175 | + long registedTimestamp = timestampFormat.parse(lastmodified).getTime(); | |
176 | + if (registedTimestamp < excelTimestamp) { | |
177 | + log.output("FHBN00030"); | |
178 | + load = true; | |
179 | + } else { | |
180 | + log.output("FHBN00028"); | |
181 | + load = false; | |
182 | + } | |
183 | + } | |
184 | + if (load) { | |
185 | + service.removeAllSCode(); | |
186 | + PoiWorkbook workbook = new PoiWorkbook(PoiWorkbookType.EXCEL2003, Config.getString(HibernateConfigName.HIBERNATE_CODEMASTER_PATH)); | |
187 | + PoiSheet sheet = workbook.getSheet(0); | |
188 | + for (int i = 1; i <= sheet.getLastRowNum(); i++) { | |
189 | + String category = sheet.getCell(i, 0).getString(); | |
190 | + String code = sheet.getCell(i, 1).getString(); | |
191 | + String orderNo = sheet.getCell(i, 2).getString(); | |
192 | + String caption = sheet.getCell(i, 3).getString(); | |
193 | + String shortCaption = sheet.getCell(i, 4).getString(); | |
194 | + String definition1 = sheet.getCell(i, 5).getString(); | |
195 | + String definition2 = sheet.getCell(i, 6).getString(); | |
196 | + String definition3 = sheet.getCell(i, 7).getString(); | |
197 | + String definition4 = sheet.getCell(i, 8).getString(); | |
198 | + String definition5 = sheet.getCell(i, 9).getString(); | |
199 | + if (StringUtil.isEmpty(category)) { | |
200 | + continue; | |
201 | + } | |
202 | + SCode sCode = new SCode(); | |
203 | + sCode.setCategory(category); | |
204 | + sCode.setCode(code); | |
205 | + sCode.setOrderNo(Integer.parseInt(orderNo)); | |
206 | + sCode.setCaption(caption); | |
207 | + sCode.setShortCaption(shortCaption); | |
208 | + sCode.setDefinition1(definition1); | |
209 | + sCode.setDefinition2(definition2); | |
210 | + sCode.setDefinition3(definition3); | |
211 | + sCode.setDefinition4(definition4); | |
212 | + sCode.setDefinition5(definition5); | |
213 | + service.registSCode(sCode); | |
214 | + log.output("FHBN00031", category, code, caption); | |
215 | + } | |
216 | + if (sConfig == null) { | |
217 | + sConfig = new SConfig(); | |
218 | + sConfig.setProperty(SCONFIG_KEY_SCODE_LOAD_TIMESTAMP); | |
219 | + } | |
220 | + sConfig.setValue1(timestampFormat.format(new Date(excelTimestamp))); | |
221 | + service.registSConfig(sConfig); | |
222 | + } | |
223 | + } catch (Throwable e) { | |
224 | + throw e; | |
225 | + } finally { | |
226 | + if (transaction != null) { | |
227 | + transaction.commit(); | |
228 | + transaction.close(); | |
229 | + } | |
230 | + } | |
231 | + } | |
232 | + | |
233 | + /** | |
134 | 234 | * システムコードマスタ管理クラスの初期化を行います。<br> |
135 | 235 | * @throws Throwable 処理中に予期せぬエラーが発生した場合にスローされます |
136 | 236 | */ |
@@ -145,7 +245,7 @@ | ||
145 | 245 | service = new SystemMasterService(context); |
146 | 246 | transaction.open(); |
147 | 247 | |
148 | - List<SCode> sCodes = service.searchAllSCode(); | |
248 | + List<SCode> sCodes = service.getAllSCode(); | |
149 | 249 | SCodeManager.initialize(sCodes); |
150 | 250 | } catch (Throwable e) { |
151 | 251 | throw e; |
@@ -7,13 +7,13 @@ | ||
7 | 7 | import java.lang.annotation.RetentionPolicy; |
8 | 8 | import java.lang.annotation.Target; |
9 | 9 | |
10 | -import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateDAO; | |
10 | +import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractGenericHibernateDAO; | |
11 | 11 | import org.phosphoresce.webcore.ext.hibernate4.transaction.AbstractHibernateEntity; |
12 | 12 | |
13 | 13 | /** |
14 | 14 | * Hibernateを利用するデータベースアクセスオブジェクトクラスの注釈インタフェースを提供します。<br> |
15 | 15 | * <br> |
16 | - * {@link AbstractHibernateDAO}を継承したデータベースアクセスオブジェクトクラスを実装する場合、必ずこのアノテーションを付与する必要があります。<br> | |
16 | + * {@link AbstractGenericHibernateDAO}を継承したデータベースアクセスオブジェクトクラスを実装する場合、必ずこのアノテーションを付与する必要があります。<br> | |
17 | 17 | * |
18 | 18 | * @author Kitagawa<br> |
19 | 19 | * |
@@ -89,7 +89,7 @@ | ||
89 | 89 | * @return システムコードマスタエンティティ |
90 | 90 | */ |
91 | 91 | public static SCode getCode(String category, String code) { |
92 | - Map<String, SCode> categorizedData = SCodeManager.instance().data.get(category); | |
92 | + Map<String, SCode> categorizedData = SCodeManager.instance().data == null ? null : SCodeManager.instance().data.get(category); | |
93 | 93 | if (categorizedData == null) { |
94 | 94 | return null; |
95 | 95 | } else { |
@@ -23,4 +23,7 @@ | ||
23 | 23 | |
24 | 24 | /** 環境設定リソース拡張子(Properties) */ |
25 | 25 | public static final String CONFIG_PROPERTIES_EXTENSION = ".properties"; |
26 | + | |
27 | + /** 環境設定マスタキー(コードマスタロードタイムスタンプ) */ | |
28 | + public static final String SCONFIG_KEY_SCODE_LOAD_TIMESTAMP = "codemaster.lastmodified"; | |
26 | 29 | } |
@@ -4,8 +4,6 @@ | ||
4 | 4 | |
5 | 5 | /** |
6 | 6 | * サンプル機能ユーティリティクラスです(ログイン画面)。<br> |
7 | - * <p> | |
8 | - * </p> | |
9 | 7 | * |
10 | 8 | * @author Kitagawa<br> |
11 | 9 | * |
@@ -13,8 +13,6 @@ | ||
13 | 13 | |
14 | 14 | /** |
15 | 15 | * サンプル機能ユーティリティクラスです(メニュー画面)。<br> |
16 | - * <p> | |
17 | - * </p> | |
18 | 16 | * |
19 | 17 | * @author Kitagawa<br> |
20 | 18 | * |
@@ -4,8 +4,6 @@ | ||
4 | 4 | |
5 | 5 | /** |
6 | 6 | * サンプル機能ユーティリティクラスです(サンプルダイアログ画面)。<br> |
7 | - * <p> | |
8 | - * </p> | |
9 | 7 | * |
10 | 8 | * @author Kitagawa<br> |
11 | 9 | * |
@@ -2,6 +2,7 @@ | ||
2 | 2 | |
3 | 3 | import org.phosphoresce.lib.commons.util.StringUtil; |
4 | 4 | import org.phosphoresce.webcore.ext.hibernate4.model.SUser; |
5 | +import org.phosphoresce.webcore.ext.hibernate4.util.SCodeManager; | |
5 | 6 | |
6 | 7 | import sample.org.phosphoresce.webcore.ext.struts.common.action.SampleHibernateService; |
7 | 8 | import sample.org.phosphoresce.webcore.ext.struts.common.action.SampleHibernateTransactionContext; |
@@ -8,8 +9,6 @@ | ||
8 | 9 | |
9 | 10 | /** |
10 | 11 | * ユーザーマスタテーブルサンプルサービスクラスです。<br> |
11 | - * <p> | |
12 | - * </p> | |
13 | 12 | * |
14 | 13 | * @author Kitagawa<br> |
15 | 14 | * |
@@ -22,7 +21,7 @@ | ||
22 | 21 | |
23 | 22 | /** |
24 | 23 | * コンストラクタ<br> |
25 | - * @param transactionContext | |
24 | + * @param transactionContext トランザクション処理コンテキストオブジェクト | |
26 | 25 | */ |
27 | 26 | public SampleSUserService(SampleHibernateTransactionContext transactionContext) { |
28 | 27 | super(transactionContext); |
@@ -51,7 +50,7 @@ | ||
51 | 50 | public long countAllUser() { |
52 | 51 | return sUserDAO.countAll(); |
53 | 52 | } |
54 | - | |
53 | + | |
55 | 54 | /** |
56 | 55 | * 指定された内容で新規にユーザーを登録します。<br> |
57 | 56 | * @param code ユーザーID |
@@ -66,6 +65,7 @@ | ||
66 | 65 | sUser.setPassword(StringUtil.toMD5Hash(password)); |
67 | 66 | sUser.setFirstName(firstName); |
68 | 67 | sUser.setLastName(lastName); |
68 | + sUser.setRoleType(SCodeManager.getCode("S0002", "0")); | |
69 | 69 | |
70 | 70 | save(sUser); |
71 | 71 |
@@ -11,6 +11,9 @@ | ||
11 | 11 | /** |
12 | 12 | * サンプルアプリケーション共通上位抽象アクションクラスです。<br> |
13 | 13 | * <p> |
14 | + * アプリケーションの各画面アクションは全てこのアクションが継承されたサブクラスとして作成します。<br> | |
15 | + * </p> | |
16 | + * <p> | |
14 | 17 | * 当クラスではアクションクラスにおける以下に示す共通のアノテーション付与及び、総称型の指定を行います。<br> |
15 | 18 | * 機能ごとのサブアクションクラスではこのクラスで決定された共通のアノテーション、総称型指定は省略して実装を行います。<br> |
16 | 19 | * <ul> |
@@ -11,6 +11,9 @@ | ||
11 | 11 | /** |
12 | 12 | * サンプルアプリケーション共通上位抽象Hibernateロジッククラスです。<br> |
13 | 13 | * <p> |
14 | + * アプリケーションの各画面ロジッククラスはすべてこのクラスを継承して作成します。<br> | |
15 | + * </p> | |
16 | + * <p> | |
14 | 17 | * 当クラスではHibernateを利用するロジッククラスにおける以下に示す共通のアノテーション付与及び、総称型の指定を行います。<br> |
15 | 18 | * 機能ごとのサブロジッククラスではこのクラスで決定された共通のアノテーション、総称型指定は省略して実装を行います。<br> |
16 | 19 | * <ul> |
@@ -3,6 +3,9 @@ | ||
3 | 3 | /** |
4 | 4 | * サンプルアプリケーション共通ユーティリティを提供します。<br> |
5 | 5 | * <p> |
6 | + * アプリケーションの各画面ユーティリティは全てこのユーティリティが継承されたサブクラスとして作成します。<br> | |
7 | + * </p> | |
8 | + * <p> | |
6 | 9 | * staticなメソッドの集合体であるユーティリティクラスの継承関係は本来必要ありません。<br> |
7 | 10 | * 但し、他のクラス同様に継承関係を持たせておくことで、将来的に共通のユーティリティメソッドを追加する場合などで、 |
8 | 11 | * 機能ごとのユーティリティクラス利用箇所から共通のユーティリティメソッドを利用するように容易にリファクタリングを行える構成とします。<br> |
@@ -10,6 +10,10 @@ | ||
10 | 10 | /** |
11 | 11 | * サンプルアプリケーション共通上位抽象Hibernateサービスクラスです。<br> |
12 | 12 | * <p> |
13 | + * Hibernateアドオンモジュールを利用したデータベースアクセスを行う業務処理実行サービス上位クラスです。<br> | |
14 | + * アプリケーションで作成するサービスクラスは全てこのクラスを継承して作成します。<br> | |
15 | + * </p> | |
16 | + * <p> | |
13 | 17 | * 当クラスではHibernateを利用するサービスクラスにおける以下に示す共通のアノテーション付与及び、総称型の指定を行います。<br> |
14 | 18 | * 機能ごとのサブサービスクラスではこのクラスで決定された共通のアノテーション、総称型指定は省略して実装を行います。<br> |
15 | 19 | * <ul> |
@@ -50,7 +54,6 @@ | ||
50 | 54 | */ |
51 | 55 | public SampleHibernateService(SampleHibernateTransactionContext transactionContext) { |
52 | 56 | super(transactionContext); |
53 | - | |
54 | 57 | sCodeDAO = createDAO(SCodeDAO.class); |
55 | 58 | sUserDAO = createDAO(SUserDAO.class); |
56 | 59 | } |
@@ -8,6 +8,10 @@ | ||
8 | 8 | /** |
9 | 9 | * サンプルアプリケーション共通上位抽象フォームクラスです。<br> |
10 | 10 | * <p> |
11 | + * 各画面フォームクラスは全てこのフォームクラスを継承したクラスとして作成します。<br> | |
12 | + * フレームワーク共通のフィールドは更に上位のフォームクラスで提供されている為、サブクラスで個別に設ける必要はありません。<br> | |
13 | + * </p> | |
14 | + * <p> | |
11 | 15 | * 当クラスではフォームクラスにおける以下に示す共通のアノテーション付与及び、総称型の指定を行います。<br> |
12 | 16 | * 機能ごとのサブフォームクラスではこのクラスで決定された共通のアノテーション、総称型指定は省略して実装を行います。<br> |
13 | 17 | * <ul> |
@@ -6,8 +6,8 @@ | ||
6 | 6 | /** |
7 | 7 | * サンプルアプリケーション共通画面セッションデータを提供します。<br> |
8 | 8 | * <p> |
9 | - * 機能ごとに設けられる画面セッションデータクラスはこのクラスを継承して実装します。<br> | |
10 | - * この継承関係を持たせることにより、アプリケーションで共通のセッションデータ管理を追加する際などで影響範囲を最小限にとどめることが可能となります。<br> | |
9 | + * アプリケーションの各画面セッションクラスはすべてこのクラスを継承して作成します。<br> | |
10 | + * 全ての画面共通で保持させたいセッションデータがある場合はここに定義されます。<br> | |
11 | 11 | * </p> |
12 | 12 | * |
13 | 13 | * @author Kitagawa<br> |
@@ -5,7 +5,7 @@ | ||
5 | 5 | /** |
6 | 6 | * サンプルアプリケーション共通定数を提供します。<br> |
7 | 7 | * <p> |
8 | - * 機能ごとに設けられる定数インタフェースはここで提供されるアプリケーション共通の定数インタフェースを継承して実装します。<br> | |
8 | + * 各画面定数インタフェースは全てこのインタフェースを継承したインタフェースとして作成します。<br> | |
9 | 9 | * </p> |
10 | 10 | * |
11 | 11 | * @author Kitagawa<br> |
@@ -9,6 +9,10 @@ | ||
9 | 9 | /** |
10 | 10 | * サンプルアプリケーション共通上位抽象Hibernateトランザクションコンテキストクラスです。<br> |
11 | 11 | * <p> |
12 | + * Hibernateアドオンモジュールを利用したデータベースアクセスを行う業務処理実行の為のコンテキストクラスです。<br> | |
13 | + * アプリケーションで実行されるHibernate処理はこのコンテキストクラスが利用されます。<br> | |
14 | + * </p> | |
15 | + * <p> | |
12 | 16 | * 当クラスではHibernateを利用するトランザクションのコンテキストクラスにおける総称型の決定を行います。<br> |
13 | 17 | * </p> |
14 | 18 | * |
@@ -18,6 +18,7 @@ | ||
18 | 18 | * 更新日 更新者 更新内容 |
19 | 19 | * 2012/10/02 Kitagawa 新規作成 |
20 | 20 | * 2013/07/10 Kitagawa getInterfaces(Class<?>)追加 |
21 | + * 2013/08/15 Kitagawa getSuperclasses(Class<?>)追加 | |
21 | 22 | *--> |
22 | 23 | */ |
23 | 24 | public class ReflectionUtil { |
@@ -30,7 +31,7 @@ | ||
30 | 31 | } |
31 | 32 | |
32 | 33 | /** |
33 | - * 指定されたクラスインタフェースを親クラスまで再帰的に検索して取得します。<br> | |
34 | + * 指定されたクラスのインタフェースを親クラスまで再帰的に検索して取得します。<br> | |
34 | 35 | * @param target ターゲットクラス |
35 | 36 | * @return インタフェースリスト |
36 | 37 | */ |
@@ -38,7 +39,12 @@ | ||
38 | 39 | List<Class<?>> list = new LinkedList<Class<?>>(); |
39 | 40 | for (Class<?> clazz = target; clazz != Object.class; clazz = clazz.getSuperclass()) { |
40 | 41 | try { |
41 | - list.addAll(Arrays.asList(clazz.getInterfaces())); | |
42 | + //list.addAll(Arrays.asList(clazz.getInterfaces())); | |
43 | + for (Class<?> i : Arrays.asList(clazz.getInterfaces())) { | |
44 | + if (!list.contains(i)) { | |
45 | + list.add(i); | |
46 | + } | |
47 | + } | |
42 | 48 | } catch (SecurityException ex) { |
43 | 49 | } |
44 | 50 | } |
@@ -46,6 +52,24 @@ | ||
46 | 52 | } |
47 | 53 | |
48 | 54 | /** |
55 | + * 指定されたクラスのスーパークラス情報を親クラスまで再帰的に検索して取得します。<br> | |
56 | + * @param target ターゲットクラス | |
57 | + * @return スーパークラスリスト | |
58 | + */ | |
59 | + public static List<Class<?>> getSuperclasses(Class<?> target) { | |
60 | + List<Class<?>> list = new LinkedList<Class<?>>(); | |
61 | + for (Class<?> clazz = target.getSuperclass(); clazz != null; clazz = clazz.getSuperclass()) { | |
62 | + try { | |
63 | + if (!list.contains(clazz)) { | |
64 | + list.add(clazz); | |
65 | + } | |
66 | + } catch (SecurityException ex) { | |
67 | + } | |
68 | + } | |
69 | + return list; | |
70 | + } | |
71 | + | |
72 | + /** | |
49 | 73 | * 指定されたクラスフィールドを親クラスまで再帰的に検索して取得します。<br> |
50 | 74 | * @param target ターゲットクラス |
51 | 75 | * @param name フィールド名 |
@@ -25,6 +25,7 @@ | ||
25 | 25 | * 更新日 更新者 更新内容 |
26 | 26 | * 2007/08/10 Kitagawa 新規作成 |
27 | 27 | * 2012/07/06 Kitagawa Webcoreフレームワーク用に新たなクラスとして新規作成 |
28 | + * 2013/08/13 Kitagawa 帳票へのデータバインド時に環境依存文字をフィルタしてセットするように修正 | |
28 | 29 | *--> |
29 | 30 | */ |
30 | 31 | public class JasperSingleWriter extends JasperWriter { |
@@ -70,7 +71,7 @@ | ||
70 | 71 | * @return データソースオブジェクト |
71 | 72 | */ |
72 | 73 | private JRDataSource createJRDataSource() { |
73 | - return new JRBeanCollectionDataSource(container.getRecords()); | |
74 | + return new JRBeanCollectionDataSource(container.getFilteredRecords()); | |
74 | 75 | } |
75 | 76 | |
76 | 77 | /** |
@@ -81,9 +82,9 @@ | ||
81 | 82 | private JasperPrint createJasperPrint() throws JRException { |
82 | 83 | JasperReport report = createJasperReport(); |
83 | 84 | if (report == null) { |
84 | - return JasperFillManager.fillReport(jrxmlPath, container.getParameters(), createJRDataSource()); | |
85 | + return JasperFillManager.fillReport(jrxmlPath, container.getFilteredParameters(), createJRDataSource()); | |
85 | 86 | } else { |
86 | - return JasperFillManager.fillReport(report, container.getParameters(), createJRDataSource()); | |
87 | + return JasperFillManager.fillReport(report, container.getFilteredParameters(), createJRDataSource()); | |
87 | 88 | } |
88 | 89 | } |
89 | 90 |
@@ -35,6 +35,7 @@ | ||
35 | 35 | * 更新日 更新者 更新内容 |
36 | 36 | * 2007/08/10 Kitagawa 新規作成 |
37 | 37 | * 2012/07/06 Kitagawa Webcoreフレームワーク用に新たなクラスとして新規作成 |
38 | + * 2013/08/13 Kitagawa 環境依存文字をフィルタしたパラメータを取得するインタフェースを追加 | |
38 | 39 | *--> |
39 | 40 | */ |
40 | 41 | public class JasperContainer implements Serializable { |
@@ -133,6 +134,14 @@ | ||
133 | 134 | } |
134 | 135 | |
135 | 136 | /** |
137 | + * 環境依存文字をフィルタしたパラメータマップオブジェクトを取得します。<br> | |
138 | + * @return パラメータマップオブジェクト | |
139 | + */ | |
140 | + public Map<String, Object> getFilteredParameters() { | |
141 | + return JasperCharacterFilter.encode(parameter); | |
142 | + } | |
143 | + | |
144 | + /** | |
136 | 145 | * データソースレコードリストオブジェクトを取得します。<br> |
137 | 146 | * @return データソースレコードリストオブジェクト |
138 | 147 | */ |
@@ -141,6 +150,14 @@ | ||
141 | 150 | } |
142 | 151 | |
143 | 152 | /** |
153 | + * 環境依存文字をフィルタしたデータソースレコードリストオブジェクトを取得します。<br> | |
154 | + * @return データソースレコードリストオブジェクト | |
155 | + */ | |
156 | + public List<Map<String, Object>> getFilteredRecords() { | |
157 | + return JasperCharacterFilter.encode(datasource); | |
158 | + } | |
159 | + | |
160 | + /** | |
144 | 161 | * データソースレコード件数を取得します。<br> |
145 | 162 | * @return データソースレコード件数 |
146 | 163 | */ |
@@ -0,0 +1,99 @@ | ||
1 | +package org.phosphoresce.webcore.ext.jasper.export; | |
2 | + | |
3 | +import java.util.HashMap; | |
4 | +import java.util.LinkedList; | |
5 | +import java.util.List; | |
6 | +import java.util.Map; | |
7 | + | |
8 | +import org.phosphoresce.lib.commons.util.StringUtil; | |
9 | + | |
10 | +/** | |
11 | + * JasperReportsバインドパラメータ設定時に環境依存文字による例外発生を防止する為のフィルタインタフェースを提供します。<br> | |
12 | + * <p> | |
13 | + * バインドパラメータ又は、データソースにおいて環境依存文字が存在する場合、iTextライブラリにおいて例外が発生します。<br> | |
14 | + * バインドデータ登録時に入力チェック等で制限がかかっていない場合に当クラスを介すことで強制的に | |
15 | + * </p> | |
16 | + * | |
17 | + * @author Kitagawa<br> | |
18 | + * | |
19 | + *<!-- | |
20 | + * 更新日 更新者 更新内容 | |
21 | + * 2013/08/13 Kitagawa 新規作成 | |
22 | + *--> | |
23 | + */ | |
24 | +public class JasperCharacterFilter { | |
25 | + | |
26 | + /** 環境依存代替文字 */ | |
27 | + public static String SUBSTITUDE_CHAR = "?"; | |
28 | + | |
29 | + /** | |
30 | + * コンストラクタ<br> | |
31 | + */ | |
32 | + private JasperCharacterFilter() { | |
33 | + super(); | |
34 | + } | |
35 | + | |
36 | + /** | |
37 | + * 指定された文字列に環境依存文字が含まれる場合、代替文字に置き換えて提供します。<br> | |
38 | + * @param value 対象文字列 | |
39 | + * @return 編集後文字列 | |
40 | + */ | |
41 | + public static String encode(String value) { | |
42 | + StringBuffer buffer = new StringBuffer(); | |
43 | + for (int i = 0; i <= value.length() - 1; i++) { | |
44 | + String test = new String(new char[] { value.charAt(i) }); | |
45 | + String etest = StringUtil.encode(test, "MS932"); | |
46 | + if ("?".equals(etest)) { | |
47 | + buffer.append(SUBSTITUDE_CHAR); | |
48 | + } else { | |
49 | + buffer.append(value.charAt(i)); | |
50 | + } | |
51 | + } | |
52 | + return buffer.toString(); | |
53 | + } | |
54 | + | |
55 | + /** | |
56 | + * 指定されたマップ情報の値が文字列の場合で環境文字が含まれる場合、代替文字列に置き換えて提供します。<br> | |
57 | + * 指定されたマップインスタンス自体の編集は行わずに、新たなマップインスタンスとして提供されます。<br> | |
58 | + * @param data 対象マップオブジェクト | |
59 | + * @return 編集後マップオブジェクト | |
60 | + */ | |
61 | + public static Map<String, Object> encode(Map<String, Object> data) { | |
62 | + if (data == null) { | |
63 | + return null; | |
64 | + } | |
65 | + Map<String, Object> render = new HashMap<String, Object>(); | |
66 | + for (String key : data.keySet()) { | |
67 | + Object value = data.get(key); | |
68 | + if (value instanceof String) { | |
69 | + render.put(key, encode((String) value)); | |
70 | + } else if (value instanceof String[]) { | |
71 | + List<String> strings = new LinkedList<String>(); | |
72 | + for (String string : (String[]) value) { | |
73 | + strings.add(encode(string)); | |
74 | + } | |
75 | + render.put(key, strings.toArray(new String[0])); | |
76 | + } else { | |
77 | + render.put(key, value); | |
78 | + } | |
79 | + } | |
80 | + return render; | |
81 | + } | |
82 | + | |
83 | + /** | |
84 | + * 指定されたリスト情報の値が文字列の場合で環境文字が含まれる場合、代替文字列に置き換えて提供します。<br> | |
85 | + * 指定されたリストインスタンス自体の編集は行わずに、新たなマップインスタンスとして提供されます。<br> | |
86 | + * @param list 対象リストオブジェクト | |
87 | + * @return 編集後リストオブジェクト | |
88 | + */ | |
89 | + public static List<Map<String, Object>> encode(List<Map<String, Object>> list) { | |
90 | + if (list == null) { | |
91 | + return null; | |
92 | + } | |
93 | + List<Map<String, Object>> render = new LinkedList<Map<String, Object>>(); | |
94 | + for (Map<String, Object> data : list) { | |
95 | + render.add(encode(data)); | |
96 | + } | |
97 | + return render; | |
98 | + } | |
99 | +} |
@@ -30,6 +30,7 @@ | ||
30 | 30 | * 更新日 更新者 更新内容 |
31 | 31 | * 2007/08/10 Kitagawa 新規作成 |
32 | 32 | * 2012/07/06 Kitagawa Webcoreフレームワーク用に新たなクラスとして新規作成 |
33 | + * 2013/08/13 Kitagawa 帳票へのデータバインド時に環境依存文字をフィルタしてセットするように修正 | |
33 | 34 | *--> |
34 | 35 | */ |
35 | 36 | public class JasperMultipageWriter extends JasperWriter { |
@@ -89,7 +90,7 @@ | ||
89 | 90 | private List<JRDataSource> createJRDataSource() { |
90 | 91 | List<JRDataSource> list = new LinkedList<JRDataSource>(); |
91 | 92 | for (JasperContainer container : containers) { |
92 | - list.add(new JRBeanCollectionDataSource(container.getRecords())); | |
93 | + list.add(new JRBeanCollectionDataSource(container.getFilteredRecords())); | |
93 | 94 | } |
94 | 95 | return list; |
95 | 96 | } |
@@ -106,9 +107,9 @@ | ||
106 | 107 | int count = 0; |
107 | 108 | for (JasperReport report : reports) { |
108 | 109 | if (report == null) { |
109 | - list.add(JasperFillManager.fillReport(jrxmlPaths.get(count), containers.get(count).getParameters(), sources.get(count))); | |
110 | + list.add(JasperFillManager.fillReport(jrxmlPaths.get(count), containers.get(count).getFilteredParameters(), sources.get(count))); | |
110 | 111 | } else { |
111 | - list.add(JasperFillManager.fillReport(report, containers.get(count).getParameters(), sources.get(count))); | |
112 | + list.add(JasperFillManager.fillReport(report, containers.get(count).getFilteredParameters(), sources.get(count))); | |
112 | 113 | } |
113 | 114 | count++; |
114 | 115 | } |