恢复GeneratedValue功能
This commit is contained in:
62
src/main/java/org/redkale/persistence/GeneratedValue.java
Normal file
62
src/main/java/org/redkale/persistence/GeneratedValue.java
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/** *****************************************************************************
|
||||||
|
* Copyright (c) 2008 - 2013 Oracle Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available under the
|
||||||
|
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
|
||||||
|
* which accompanies this distribution.
|
||||||
|
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
* and the Eclipse Distribution License is available at
|
||||||
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Linda DeMichiel - Java Persistence 2.1
|
||||||
|
* Linda DeMichiel - Java Persistence 2.0
|
||||||
|
*
|
||||||
|
***************************************************************************** */
|
||||||
|
package org.redkale.persistence;
|
||||||
|
|
||||||
|
import static java.lang.annotation.ElementType.FIELD;
|
||||||
|
import static java.lang.annotation.ElementType.METHOD;
|
||||||
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides for the specification of generation strategies for the
|
||||||
|
* values of primary keys.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* The <code>GeneratedValue</code> annotation
|
||||||
|
* may be applied to a primary key property or field of an entity or
|
||||||
|
* mapped superclass in conjunction with the {@link Id} annotation.
|
||||||
|
* The use of the <code>GeneratedValue</code> annotation is only
|
||||||
|
* required to be supported for simple primary keys. Use of the
|
||||||
|
* <code>GeneratedValue</code> annotation is not supported for derived
|
||||||
|
* primary keys.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* Example 1:
|
||||||
|
*
|
||||||
|
* @Id
|
||||||
|
* @GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
|
||||||
|
* @Column(name="CUST_ID")
|
||||||
|
* public Long getId() { return id; }
|
||||||
|
*
|
||||||
|
* Example 2:
|
||||||
|
*
|
||||||
|
* @Id
|
||||||
|
* @GeneratedValue(strategy=TABLE, generator="CUST_GEN")
|
||||||
|
* @Column(name="CUST_ID")
|
||||||
|
* Long id;
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @see Id
|
||||||
|
*
|
||||||
|
* @since Java Persistence 1.0
|
||||||
|
*/
|
||||||
|
@Target({METHOD, FIELD})
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
|
||||||
|
public @interface GeneratedValue {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -442,7 +442,9 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
|
|||||||
sqltype = column.length >= 65535 ? "TEXT" : ("VARCHAR(" + column.length + ")");
|
sqltype = column.length >= 65535 ? "TEXT" : ("VARCHAR(" + column.length + ")");
|
||||||
sqlnull = !column.nullable ? "NOT NULL DEFAULT ''" : "NULL";
|
sqlnull = !column.nullable ? "NOT NULL DEFAULT ''" : "NULL";
|
||||||
}
|
}
|
||||||
sb.append(" `").append(column.column).append("` ").append(sqltype).append(" ").append(sqlnull);
|
sb.append(" `").append(column.column).append("` ").append(sqltype)
|
||||||
|
.append(column.primary && info.isAutoGenerated() ? " AUTO_INCREMENT " : " ")
|
||||||
|
.append(column.primary && info.isAutoGenerated() ? "" : sqlnull);
|
||||||
if (column.comment != null && !column.comment.isEmpty()) {
|
if (column.comment != null && !column.comment.isEmpty()) {
|
||||||
sb.append(" COMMENT '").append(column.comment.replace('\'', '"')).append("'");
|
sb.append(" COMMENT '").append(column.comment.replace('\'', '"')).append("'");
|
||||||
}
|
}
|
||||||
@@ -552,7 +554,11 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
|
|||||||
sqltype = column.length >= 65535 ? "TEXT" : ("VARCHAR(" + column.length + ")");
|
sqltype = column.length >= 65535 ? "TEXT" : ("VARCHAR(" + column.length + ")");
|
||||||
sqlnull = !column.nullable ? "NOT NULL DEFAULT ''" : "NULL";
|
sqlnull = !column.nullable ? "NOT NULL DEFAULT ''" : "NULL";
|
||||||
}
|
}
|
||||||
sb.append(" ").append(column.column).append(" ").append(sqltype).append(" ").append(sqlnull);
|
if (column.primary && info.isAutoGenerated()) {
|
||||||
|
sqltype = "SERIAL";
|
||||||
|
}
|
||||||
|
sb.append(" ").append(column.column).append(" ").append(sqltype).append(" ")
|
||||||
|
.append(column.primary && info.isAutoGenerated() ? "" : sqlnull);
|
||||||
if (column.comment != null && !column.comment.isEmpty()) {
|
if (column.comment != null && !column.comment.isEmpty()) {
|
||||||
//postgresql不支持DDL中直接带comment
|
//postgresql不支持DDL中直接带comment
|
||||||
comments.add("COMMENT ON COLUMN " + info.getOriginTable() + "." + column.column + " IS '" + column.comment.replace('\'', '"') + "'");
|
comments.add("COMMENT ON COLUMN " + info.getOriginTable() + "." + column.column + " IS '" + column.comment.replace('\'', '"') + "'");
|
||||||
|
|||||||
@@ -135,7 +135,9 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
final List<PreparedStatement> prestmts = new ArrayList<>();
|
final List<PreparedStatement> prestmts = new ArrayList<>();
|
||||||
for (Map.Entry<String, PrepareInfo<T>> en : prepareInfos.entrySet()) {
|
for (Map.Entry<String, PrepareInfo<T>> en : prepareInfos.entrySet()) {
|
||||||
PrepareInfo<T> prepareInfo = en.getValue();
|
PrepareInfo<T> prepareInfo = en.getValue();
|
||||||
PreparedStatement prestmt = conn.prepareUpdateStatement(prepareInfo.prepareSql);
|
PreparedStatement prestmt = info.isAutoGenerated()
|
||||||
|
? conn.prepareUpdateStatement(prepareInfo.prepareSql, Statement.RETURN_GENERATED_KEYS)
|
||||||
|
: conn.prepareUpdateStatement(prepareInfo.prepareSql);
|
||||||
for (final T value : prepareInfo.entitys) {
|
for (final T value : prepareInfo.entitys) {
|
||||||
bindStatementParameters(conn, prestmt, info, attrs, value);
|
bindStatementParameters(conn, prestmt, info, attrs, value);
|
||||||
prestmt.addBatch();
|
prestmt.addBatch();
|
||||||
@@ -147,7 +149,9 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
|
|
||||||
protected <T> PreparedStatement prepareInsertEntityStatement(SourceConnection conn, String sql, EntityInfo<T> info, T... entitys) throws SQLException {
|
protected <T> PreparedStatement prepareInsertEntityStatement(SourceConnection conn, String sql, EntityInfo<T> info, T... entitys) throws SQLException {
|
||||||
Attribute<T, Serializable>[] attrs = info.insertAttributes;
|
Attribute<T, Serializable>[] attrs = info.insertAttributes;
|
||||||
final PreparedStatement prestmt = conn.prepareUpdateStatement(sql);
|
final PreparedStatement prestmt = info.isAutoGenerated()
|
||||||
|
? conn.prepareUpdateStatement(sql, Statement.RETURN_GENERATED_KEYS)
|
||||||
|
: conn.prepareUpdateStatement(sql);
|
||||||
for (final T value : entitys) {
|
for (final T value : entitys) {
|
||||||
bindStatementParameters(conn, prestmt, info, attrs, value);
|
bindStatementParameters(conn, prestmt, info, attrs, value);
|
||||||
prestmt.addBatch();
|
prestmt.addBatch();
|
||||||
@@ -341,6 +345,8 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
PreparedStatement prestmt = null;
|
PreparedStatement prestmt = null;
|
||||||
List<PreparedStatement> prestmts = null;
|
List<PreparedStatement> prestmts = null;
|
||||||
Map<String, PrepareInfo<T>> prepareInfos = null;
|
Map<String, PrepareInfo<T>> prepareInfos = null;
|
||||||
|
final Attribute primary = info.getPrimary();
|
||||||
|
final Class primaryType = primary.type();
|
||||||
Attribute<T, Serializable>[] attrs = info.insertAttributes;
|
Attribute<T, Serializable>[] attrs = info.insertAttributes;
|
||||||
if (info.getTableStrategy() == null) { //单库单表
|
if (info.getTableStrategy() == null) { //单库单表
|
||||||
presql = info.getInsertQuestionPrepareSQL(entitys[0]);
|
presql = info.getInsertQuestionPrepareSQL(entitys[0]);
|
||||||
@@ -352,6 +358,23 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
try {
|
try {
|
||||||
if (info.getTableStrategy() == null) { //单库单表
|
if (info.getTableStrategy() == null) { //单库单表
|
||||||
c = Utility.sum(prestmt.executeBatch());
|
c = Utility.sum(prestmt.executeBatch());
|
||||||
|
if (info.isAutoGenerated()) { //由数据库自动生成主键值
|
||||||
|
ResultSet set = prestmt.getGeneratedKeys();
|
||||||
|
int i = -1;
|
||||||
|
while (set.next()) {
|
||||||
|
T entity = entitys[++i];
|
||||||
|
if (primaryType == int.class || primaryType == Integer.class) {
|
||||||
|
primary.set(entity, set.getInt(1));
|
||||||
|
} else if (primaryType == long.class || primaryType == long.class) {
|
||||||
|
primary.set(entity, set.getLong(1));
|
||||||
|
} else if (primaryType == String.class) {
|
||||||
|
primary.set(entity, set.getString(1));
|
||||||
|
} else {
|
||||||
|
primary.set(entity, set.getObject(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set.close();
|
||||||
|
}
|
||||||
conn.offerUpdateStatement(prestmt);
|
conn.offerUpdateStatement(prestmt);
|
||||||
} else { //分库分表
|
} else { //分库分表
|
||||||
int c1 = 0;
|
int c1 = 0;
|
||||||
@@ -359,6 +382,28 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
c1 += Utility.sum(stmt.executeBatch());
|
c1 += Utility.sum(stmt.executeBatch());
|
||||||
}
|
}
|
||||||
c = c1;
|
c = c1;
|
||||||
|
if (info.isAutoGenerated()) { //由数据库自动生成主键值
|
||||||
|
int j = -1;
|
||||||
|
for (Map.Entry<String, PrepareInfo<T>> en : prepareInfos.entrySet()) {
|
||||||
|
PrepareInfo<T> prepareInfo = en.getValue();
|
||||||
|
PreparedStatement stmt = prestmts.get(++j);
|
||||||
|
ResultSet set = stmt.getGeneratedKeys();
|
||||||
|
int i = -1;
|
||||||
|
while (set.next()) {
|
||||||
|
T entity = prepareInfo.entitys.get(++i);
|
||||||
|
if (primaryType == int.class || primaryType == Integer.class) {
|
||||||
|
primary.set(entity, set.getInt(1));
|
||||||
|
} else if (primaryType == long.class || primaryType == long.class) {
|
||||||
|
primary.set(entity, set.getLong(1));
|
||||||
|
} else if (primaryType == String.class) {
|
||||||
|
primary.set(entity, set.getString(1));
|
||||||
|
} else {
|
||||||
|
primary.set(entity, set.getObject(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
for (PreparedStatement stmt : prestmts) {
|
for (PreparedStatement stmt : prestmts) {
|
||||||
conn.offerUpdateStatement(stmt);
|
conn.offerUpdateStatement(stmt);
|
||||||
}
|
}
|
||||||
@@ -490,6 +535,23 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
conn.offerUpdateStatement(prestmt);
|
conn.offerUpdateStatement(prestmt);
|
||||||
prestmt = prepareInsertEntityStatement(conn, presql, info, entitys);
|
prestmt = prepareInsertEntityStatement(conn, presql, info, entitys);
|
||||||
c = Utility.sum(prestmt.executeBatch());
|
c = Utility.sum(prestmt.executeBatch());
|
||||||
|
if (info.isAutoGenerated()) { //由数据库自动生成主键值
|
||||||
|
ResultSet set = prestmt.getGeneratedKeys();
|
||||||
|
int i = -1;
|
||||||
|
while (set.next()) {
|
||||||
|
T entity = entitys[++i];
|
||||||
|
if (primaryType == int.class || primaryType == Integer.class) {
|
||||||
|
primary.set(entity, set.getInt(1));
|
||||||
|
} else if (primaryType == long.class || primaryType == long.class) {
|
||||||
|
primary.set(entity, set.getLong(1));
|
||||||
|
} else if (primaryType == String.class) {
|
||||||
|
primary.set(entity, set.getString(1));
|
||||||
|
} else {
|
||||||
|
primary.set(entity, set.getObject(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set.close();
|
||||||
|
}
|
||||||
conn.offerUpdateStatement(prestmt);
|
conn.offerUpdateStatement(prestmt);
|
||||||
} else { //分库分表
|
} else { //分库分表
|
||||||
for (PreparedStatement stmt : prestmts) {
|
for (PreparedStatement stmt : prestmts) {
|
||||||
@@ -501,6 +563,28 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
c1 += Utility.sum(stmt.executeBatch());
|
c1 += Utility.sum(stmt.executeBatch());
|
||||||
}
|
}
|
||||||
c = c1;
|
c = c1;
|
||||||
|
if (info.isAutoGenerated()) { //由数据库自动生成主键值
|
||||||
|
int j = -1;
|
||||||
|
for (Map.Entry<String, PrepareInfo<T>> en : prepareInfos.entrySet()) {
|
||||||
|
PrepareInfo<T> prepareInfo = en.getValue();
|
||||||
|
PreparedStatement stmt = prestmts.get(++j);
|
||||||
|
ResultSet set = stmt.getGeneratedKeys();
|
||||||
|
int i = -1;
|
||||||
|
while (set.next()) {
|
||||||
|
T entity = prepareInfo.entitys.get(++i);
|
||||||
|
if (primaryType == int.class || primaryType == Integer.class) {
|
||||||
|
primary.set(entity, set.getInt(1));
|
||||||
|
} else if (primaryType == long.class || primaryType == long.class) {
|
||||||
|
primary.set(entity, set.getLong(1));
|
||||||
|
} else if (primaryType == String.class) {
|
||||||
|
primary.set(entity, set.getString(1));
|
||||||
|
} else {
|
||||||
|
primary.set(entity, set.getObject(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
for (PreparedStatement stmt : prestmts) {
|
for (PreparedStatement stmt : prestmts) {
|
||||||
conn.offerUpdateStatement(stmt);
|
conn.offerUpdateStatement(stmt);
|
||||||
}
|
}
|
||||||
@@ -2897,6 +2981,10 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
return conn.prepareStatement(sql);
|
return conn.prepareStatement(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PreparedStatement prepareUpdateStatement(String sql, int resultSetType) throws SQLException {
|
||||||
|
return conn.prepareStatement(sql, resultSetType);
|
||||||
|
}
|
||||||
|
|
||||||
public void offerUpdateStatement(final PreparedStatement stmt) throws SQLException {
|
public void offerUpdateStatement(final PreparedStatement stmt) throws SQLException {
|
||||||
stmt.close();
|
stmt.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,4 +67,11 @@ public interface DataSqlSource extends DataSource {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Map<String, String> executeQueryStrStrMap(String sql) {
|
||||||
|
return executeQueryMap(String.class, String.class, sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
default Map<Integer, String> executeQueryIntStrMap(String sql) {
|
||||||
|
return executeQueryMap(Integer.class, String.class, sql);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ public final class EntityInfo<T> {
|
|||||||
//DDL字段
|
//DDL字段
|
||||||
final EntityColumn[] primaryColumnOneArray;
|
final EntityColumn[] primaryColumnOneArray;
|
||||||
|
|
||||||
|
//是否由数据库生成主键值
|
||||||
|
private final boolean autoGenerated;
|
||||||
|
|
||||||
//DDL字段集合
|
//DDL字段集合
|
||||||
final EntityColumn[] ddlColumns;
|
final EntityColumn[] ddlColumns;
|
||||||
|
|
||||||
@@ -381,6 +384,7 @@ public final class EntityInfo<T> {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.log(Level.SEVERE, type + " cannot find ConstructorParameters Creator", e);
|
logger.log(Level.SEVERE, type + " cannot find ConstructorParameters Creator", e);
|
||||||
}
|
}
|
||||||
|
boolean auto = false;
|
||||||
String[] constructorParameters = cps;
|
String[] constructorParameters = cps;
|
||||||
Attribute idAttr0 = null;
|
Attribute idAttr0 = null;
|
||||||
Map<String, String> aliasmap = null;
|
Map<String, String> aliasmap = null;
|
||||||
@@ -431,9 +435,12 @@ public final class EntityInfo<T> {
|
|||||||
|
|
||||||
boolean idFlag = field.getAnnotation(Id.class) != null || field.getAnnotation(javax.persistence.Id.class) != null;
|
boolean idFlag = field.getAnnotation(Id.class) != null || field.getAnnotation(javax.persistence.Id.class) != null;
|
||||||
if (idFlag && idAttr0 == null) {
|
if (idFlag && idAttr0 == null) {
|
||||||
|
auto = field.getAnnotation(GeneratedValue.class) != null;
|
||||||
idAttr0 = attr;
|
idAttr0 = attr;
|
||||||
insertCols.add(sqlField);
|
if (!auto) {
|
||||||
insertAttrs.add(attr);
|
insertCols.add(sqlField);
|
||||||
|
insertAttrs.add(attr);
|
||||||
|
}
|
||||||
RedkaleClassLoader.putReflectionField(cltmp.getName(), field);
|
RedkaleClassLoader.putReflectionField(cltmp.getName(), field);
|
||||||
} else {
|
} else {
|
||||||
if (col == null || col.insertable()) {
|
if (col == null || col.insertable()) {
|
||||||
@@ -488,6 +495,7 @@ public final class EntityInfo<T> {
|
|||||||
} while ((cltmp = cltmp.getSuperclass()) != Object.class);
|
} while ((cltmp = cltmp.getSuperclass()) != Object.class);
|
||||||
this.jsonConvert = convert == null ? DEFAULT_JSON_CONVERT : convert;
|
this.jsonConvert = convert == null ? DEFAULT_JSON_CONVERT : convert;
|
||||||
|
|
||||||
|
this.autoGenerated = auto;
|
||||||
this.primary = idAttr0;
|
this.primary = idAttr0;
|
||||||
this.primaryOneArray = new Attribute[]{this.primary};
|
this.primaryOneArray = new Attribute[]{this.primary};
|
||||||
List<EntityColumn> ddls = new ArrayList<>();
|
List<EntityColumn> ddls = new ArrayList<>();
|
||||||
@@ -777,6 +785,10 @@ public final class EntityInfo<T> {
|
|||||||
return table == null;
|
return table == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isAutoGenerated() {
|
||||||
|
return autoGenerated;
|
||||||
|
}
|
||||||
|
|
||||||
public DistributeTableStrategy<T> getTableStrategy() {
|
public DistributeTableStrategy<T> getTableStrategy() {
|
||||||
return tableStrategy;
|
return tableStrategy;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user