Beanが引き継いだらどうなるの?
3602 ワード
public class Base {
public long getBase_item() {
return base_item;
}
public void setBase_item(long base_item) {
this.base_item = base_item;
}
private long base_item;
}
public class Test extends Base {
public long getIn_test() {
return in_test;
}
public void setIn_test(long in_test) {
this.in_test = in_test;
}
private long in_test;
}
public class Go {
public static void main(String[] arg) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Test t = new Test();
Map<String,Object> props =BeanUtils.describe(t);
System.out.println(props);
for (Map.Entry<String, Object> entry : props.entrySet()) {
String key = entry.getKey();
System.out.println(key);
}
}
}
{base_item=0, in_test=0, class=class net.duguying.community.bean.Test}
base_item
in_test
class
Process finished with exit code 0
Pojo
private long _InsertObject(POJO obj) {
Map<String, Object> pojo_bean = obj.ListInsertableFields();
String[] fields = pojo_bean.keySet().toArray(
new String[pojo_bean.size()]);
StringBuilder sql = new StringBuilder("INSERT INTO ");
sql.append(obj.TableName());
sql.append("(`");
for (int i = 0; i < fields.length; i++) {
if (i > 0)
sql.append("`,`");
sql.append(fields[i]);
}
sql.append("`) VALUES(");
for (int i = 0; i < fields.length; i++) {
if (i > 0)
sql.append(',');
sql.append('?');
}
sql.append(')');
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = QueryHelper.getConnection().prepareStatement(sql.toString(),
PreparedStatement.RETURN_GENERATED_KEYS);
for (int i = 0; i < fields.length; i++) {
ps.setObject(i + 1, pojo_bean.get(fields[i]));
}
ps.executeUpdate();
if (getId() > 0)
return getId();
rs = ps.getGeneratedKeys();
return rs.next() ? rs.getLong(1) : -1;
} catch (SQLException e) {
throw new DBException(e);
} finally {
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(ps);
sql = null;
fields = null;
pojo_bean = null;
}
}
Test beanはBase beanを継承し、最後にTestフィールドにBaseが含まれているフィールドを取得し、PojoのSaveメソッド、doUpdateメソッドはこのようにフィールドを自動的に取得してinsertおよびupdate文を生成する.Project beanとReward beanの違いは大きく、RewardがProjectを継承するのはまったくおかしい.Project独自のフィールドが山積みになり、PojoのSave/doUpdateなどの方法がすべて廃棄され、beanもbeanの意味を失うため、RewardがProjectを継承するのはまったくおかしい.
RewardはBaseを継承し、ProjectはBaseを継承します.Baseテーブル抽出共通フィールドを作成します.RewardテーブルとProjectテーブルのstatusフィールドのストリームは、名前が同じ値で意味が大きく異なります.そのため、Baseテーブルでデータの意味が一致するように、setStatusメソッドをRewardテーブルとProjectテーブルに書き換える必要があります.Baseテーブルの初志も失い、RewardとProjectの両方のエンティティクラスを同時に変更することになります.無理に実行できます.変更が大きく、後でBaseクラスに新しい属性を追加することはできません.Baseクラスを継承するエンティティに対応するテーブルにもbaseエンティティに含まれるフィールドが含まれている必要があります.そうしないと、Save/doUpdateも虚構になります.
したがって,エンティティクラス間の相互継承は単純に単純である.
個人的には、共通のフィールドをProjectテーブルに格納しても、共通のフィールドを新しいテーブルBaseに格納しても、「継承」という概念にかかわることはなく、ProjectとRewardテーブルを削除する際に、共通のフィールドをベーステーブルに同期して削除するのが正しいと思います.エンティティクラスはfinalとして定義する必要があります.