我回來了,現在已經出現了陽光的錯誤/問題。通常我測試本地開發和H2DB上的變化,但據我所知,這也必須在Oracle和MSSQL上工作。 現在再次對oracle進行測試,發生了這個問題: 關鍵COR_VIEWSETTINGSCOR_USERSETTINGS_FK0和COR_VIEWSETTINGSCOR_USERSETTINGS_FK1是自動生成的,對於oracle數據庫來說太長了。 要知道如何創建這些鍵,我現在將向您展示實體UserSettings和UserViewSettings。 提示:如果他們混淆你,你可以忽略實體並進一步進行編輯。也許你仍然可以幫助我。自動休眠索引創建時間太長
UserSettings
/**
The Class UserSettings.
*/
@org.hibernate.envers.Audited
@DataObject(value = UserSettings.DATA_OBJECT_NAME)
@CRUDDefinition(supportsRead = true, supportsCreate = true, supportsUpdate = true, supportsDelete = true)
@Entity(name = UserSettings.DATA_OBJECT_NAME)
@NamedQuery(name = UserSettings.DATA_OBJECT_NAME, query = "from userSettings e where e.name = :name")
@javax.persistence.Inheritance(strategy = javax.persistence.InheritanceType.TABLE_PER_CLASS)
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "USERSETTINGS_ID"))
})
@Table(name = "COR_USERSETTINGS", indexes = {
@javax.persistence.Index(name="COR_USERSETTINGS_FK0", columnList = "SETTINGSTYPE_ID"),
@javax.persistence.Index(name="COR_USERSETTINGS_FK1", columnList = "USER_ID"),
}
)
public class UserSettings extends NamedRevisionEntity implements NameSettingsType, NameSettings
{
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The Constant DATA_OBJECT_NAME. */
public static final String DATA_OBJECT_NAME = "userSettings";
@javax.persistence.Basic(fetch = javax.persistence.FetchType.EAGER, optional = false)
@Column(name = "SETTINGS", nullable = false, unique = false, insertable = true, updatable = true)
@javax.persistence.Lob
private java.lang.String settings;
@javax.persistence.ManyToOne(fetch = javax.persistence.FetchType.EAGER, optional = false)
@javax.persistence.JoinColumn(name = "SETTINGSTYPE_ID", nullable = false, unique = false, insertable = true, updatable = true)
private SettingsType settingsType;
@javax.persistence.ManyToOne(fetch = javax.persistence.FetchType.EAGER, optional = true)
@javax.persistence.JoinColumn(name = "USER_ID", nullable = true, unique = false, insertable = true, updatable = true)
private User user;
public SettingsType getSettingsType()
{
return settingsType;
}
public void setSettingsType(SettingsType settingsType)
{
this.settingsType = settingsType;
}
public User getUser()
{
return user;
}
public void setUser(User user)
{
this.user = user;
}
public java.lang.String getSettings()
{
return settings;
}
public void setSettings(java.lang.String settings)
{
this.settings = settings;
}
@Override
public String getDataObjectName()
{
return DATA_OBJECT_NAME;
}
@Override
public String toString()
{
StringBuilder builder = new StringBuilder(super.toString());
builder.append(", ");
try
{
builder.append(ToStringUtils.referenceToString("settingsType", "SettingsType", this.settingsType));
}
catch(Exception ex)
{
builder.append(ex.getClass().getName() );
builder.append(": ");
builder.append(ex.getMessage());
}
builder.append(", ");
try
{
builder.append(ToStringUtils.referenceToString("user", "User", this.user));
}
catch(Exception ex)
{
builder.append(ex.getClass().getName() );
builder.append(": ");
builder.append(ex.getMessage());
}
builder.append("]");
return builder.toString();
}
}
UserViewSettings
/**
The Class UserViewSettings.
*/
@org.hibernate.envers.Audited
@DataObject(value = UserViewSettings.DATA_OBJECT_NAME)
@CRUDDefinition(supportsRead = true, supportsCreate = true, supportsUpdate = true, supportsDelete = true)
@Entity(name = UserViewSettings.DATA_OBJECT_NAME)
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "VIEWSETTINGS_ID"))
})
@Table(name = "COR_VIEWSETTINGS", uniqueConstraints = {
@javax.persistence.UniqueConstraint(name="COR_VIEWSETTINGS_UNQ1", columnNames = { "NAME", "SETTINGSTYPE_ID", "VIEW_NAME", "VIEWTYPE_ID" }),
}
, indexes = {
@javax.persistence.Index(name="COR_VIEWSETTINGS_FK0", columnList = "VIEWTYPE_ID"),
}
)
public class UserViewSettings extends UserSettings implements NameViewName, NameViewType
{
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The Constant DATA_OBJECT_NAME. */
public static final String DATA_OBJECT_NAME = "userViewSettings";
@javax.persistence.Basic(fetch = javax.persistence.FetchType.EAGER, optional = false)
@Column(name = "VIEW_NAME", nullable = false, unique = false, insertable = true, updatable = true)
private java.lang.String viewName;
@javax.persistence.ManyToOne(fetch = javax.persistence.FetchType.EAGER, optional = true)
@javax.persistence.JoinColumn(name = "VIEWTYPE_ID", nullable = true, unique = false, insertable = true, updatable = true)
private ViewType viewType;
public java.lang.String getViewName()
{
return viewName;
}
public void setViewName(java.lang.String viewName)
{
this.viewName = viewName;
}
public ViewType getViewType()
{
return viewType;
}
public void setViewType(ViewType viewType)
{
this.viewType = viewType;
}
@Override
public String getDataObjectName()
{
return DATA_OBJECT_NAME;
}
@Override
public String toString()
{
StringBuilder builder = new StringBuilder(super.toString());
builder.append(", ");
builder.append("viewName");
builder.append("=");
builder.append(this.viewName);
builder.append(", ");
try
{
builder.append(ToStringUtils.referenceToString("viewType", "ViewType", this.viewType));
}
catch(Exception ex)
{
builder.append(ex.getClass().getName() );
builder.append(": ");
builder.append(ex.getMessage());
}
builder.append("]");
return builder.toString();
}
}
與Hibernate 5.2和Oracle數據庫11然後導致錯誤Wildfly 10.0.0開始,自動生成的密鑰COR_VIEWSETTINGSCOR_USERSETTINGS_FK0和COR_VIEWSETTINGSCOR_USERSETTINGS_對於數據庫來說FK1自然太長了。
我看了一下Hibernate的NamingStrategies,甚至嘗試了一些,但他們沒有改變我的錯誤。
如何影響這些鍵的生成?
編輯:
所以打開DEBUG給了我這個:
2016-11-29 09:22:03,190 DEBUG [org.hibernate.SQL] (ServerService Thread Pool -- 58) create index COR_USERSETTINGS_FK0 on COR_USERSETTINGS (SETTINGSTYPE_ID)
2016-11-29 09:22:03,190 DEBUG [org.hibernate.SQL] (ServerService Thread Pool -- 58) create index COR_USERSETTINGS_FK1 on COR_USERSETTINGS (USER_ID)
2016-11-29 09:22:03,190 DEBUG [org.hibernate.SQL] (ServerService Thread Pool -- 58) create index COR_VIEWSETTINGSCOR_USERSETTINGS_FK0 on COR_VIEWSETT INGS(SETTINGSTYPE_ID)
2016-11-29 09:22:03,190 DEBUG [org.hibernate.SQL] (ServerService Thread Pool -- 58) create index COR_VIEWSETTINGSCOR_USERSETTINGS_FK1 on COR_VIEWSETTINGS (USER_ID)
2016-11-29 09:22:03,190 DEBUG [org.hibernate.SQL] (ServerService Thread Pool -- 58) create index COR_VIEWSETTINGS_FK0 on COR_VIEWSETTINGS (VIEWTYPE_ID)
現在我發現類ImplicitIndexNameSource在org.hibernate.boot.model.naming但互聯網包並沒有真正舉出我能用這個做什麼的例子,它似乎是一個很長一段時間以來很久的空班。
編輯2:
以前的編輯似乎是錯誤的路徑。我找到了創建這些日誌的地方。它是StandardIndexExporter從SchemaCreatorImpl被調用。所以我需要深入挖掘框架,但如果有人看到這一點。這是正確的道路嗎?我可以修改代碼,以便他能做我想要的東西嗎?這似乎是就是hbm2ddl這是因爲在StandardIndexExport在這些線路創建索引獲取的罪魁禍首:
final String indexNameForCreation;
if (dialect.qualifyIndexName()) {
indexNameForCreation = jdbcEnvironment.getQualifiedObjectNameFormatter().format(
new QualifiedNameImpl(
index.getTable().getQualifiedTableName().getCatalogName(),
index.getTable().getQualifiedTableName().getSchemaName(),
jdbcEnvironment.getIdentifierHelper().toIdentifier(index.getName())
),
jdbcEnvironment.getDialect()
);
}
else {
indexNameForCreation = index.getName();
}
final StringBuilder buf = new StringBuilder()
.append("create index ")
.append(indexNameForCreation)
.append(" on ")
.append(tableName)
.append(" (");
boolean first = true;
Iterator<Column> columnItr = index.getColumnIterator();
while (columnItr.hasNext()) {
final Column column = columnItr.next();
if (first) {
first = false;
}
else {
buf.append(", ");
}
buf.append((column.getQuotedName(dialect)));
}
buf.append(")");
return new String[] { buf.toString() };
我希望有很大的幫助。這真是令人沮喪