mysql - 使用MySql 8的Hibernate 5.4.1并非所有表都是自动创建的

标签 mysql database hibernate maven persistence

我在使用Hibernate时遇到问题。 Hibernate创建一些表,但不是全部。我已经在Google上阅读到MySql具有新的自动促进剂策略,因此旧的GenerationType.AUTO将不起作用。我不知道到底是什么问题,但是这里有一些尚未创建的表。

我已经花了大约两到五个小时,却找不到解决方案。

EventTrigger实体:

@SuppressWarnings("serial")
@Entity
@Table(name= "EventTrigger")
public class EventTrigger implements IControleEntity {

  public static final String TABLE = "event_trigger";

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @OneToMany(cascade = CascadeType.ALL,orphanRemoval = true, mappedBy = "trigger", targetEntity = AbstractEventTriggerAction.class)
  @LazyCollection(LazyCollectionOption.FALSE)
  private List<AbstractEventTriggerAction> actions = new ArrayList<>();

  @OneToOne(fetch = FetchType.EAGER,optional = false, cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name = "condition_bundle_id")
  private EventTriggerConditionBundle conditionBundle;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(nullable = false, updatable = false, name = "created_at")
  private Date createdAt;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(nullable = true, updatable = true, name = "last_fired_at")
  private Date lastFiredAt;

  @ManyToOne(optional = false , fetch = FetchType.LAZY)
  @JoinColumn(name = "createdby_id")
  private ControleUser createdBy;

  @Column(name = "priority")
  private int priority;

  @Column(name = "outdated")
  private boolean outdated;

  @Enumerated
  @Column(name = "type", nullable = false)
  private EventTriggerType type;

  @Column(name = "active")
  private boolean active;

  @Column(name = "name")
  private String name;

  @Column(name = "description")
  private String description;

  @Column(name = "grouping")
  private String grouping;

  @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL, targetEntity = GlobalFilter.class)
  @JoinColumn(name = "entity_filter_id", nullable = true)
  private GlobalFilter entityFilter;

  /*
   * Reserved Fields Start
   */
  @Column(name = "reserved_string1", columnDefinition = "TEXT")
  private String reservedString1;
  @Column(name = "reserved_string2", columnDefinition = "TEXT")
  private String reservedString2;
  @Column(name = "reserved_string3", columnDefinition = "TEXT")
  private String reservedString3;
  @Column(name = "reserved_string4", columnDefinition = "TEXT")
  private String reservedString4;
  @Column(name = "reserved_string5", columnDefinition = "TEXT")
  private String reservedString5;

  @Column(name = "reserved_long1")
  private Long reservedLong1;
  @Column(name = "reserved_long2")
  private Long reservedLong2;
  @Column(name = "reserved_long3")
  private Long reservedLong3;
  @Column(name = "reserved_long4")
  private Long reservedLong4;
  @Column(name = "reserved_long5")
  private Long reservedLong5;

  @Column(name = "reserved_boolean1")
  private Boolean reservedBoolean1;
  @Column(name = "reserved_boolean2")
  private Boolean reservedBoolean2;
  @Column(name = "reserved_boolean3")
  private Boolean reservedBoolean3;
  @Column(name = "reserved_boolean4")
  private Boolean reservedBoolean4;
  @Column(name = "reserved_boolean5")
  private Boolean reservedBoolean5;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "reserved_date1")
  private Date reservedDate1;
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "reserved_date2")
  private Date reservedDate2;
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "reserved_date3")
  private Date reservedDate3;

  // gets and sets
}


历史记录实体:

public class History implements Comparable<History>, IIdEntity {

  private static final long serialVersionUID = 3908163307906340358L;

  public static final String TABLE = "history";

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(unique = true, nullable = false, name = "id")
  private long id;

  @Column(nullable = false, updatable = false, name = "created_at")
  @Temporal(TemporalType.TIMESTAMP)
  private Date createdAt;

  @ManyToOne(optional = false, targetEntity = ControleUser.class)
  @JoinColumn(name = "createdby_id")
  private ControleUser createdBy;

  @Column(nullable = false, name = "creatortype", updatable = false, length = 255)
  @Enumerated(EnumType.STRING)
  private HistoryCreatorType creatorType;

  @Column(length = 8192, nullable = false, name = "message_de")
  private String messageDe;

  @Column(length = 8192, nullable = false, name = "message_en")
  private String messageEn;

  @Column(nullable = true, name = "subject_name")
  private String subjectName;

  @Column(nullable = true, name = "object_name")
  private String objectName;

  @Column(nullable = true, name = "controle_version")
  private String controleVersion;

  @Column(nullable = true, name = "hash")
  private String hashValue;

  @Column(nullable = true, name = "previous_hash")
  private String prevHashValue;

  // ------------------------- Start Foreign Keys -------------------------//

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = Account.class, optional = true)
  @JoinColumn(name = "user_id")
  private Account user;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = Permission.class, optional = true)
  @JoinColumn(name = "permission_id")
  private Permission permission;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = GridState.class, optional = true)
  @JoinColumn(name = "gridstate_id")
  private GridState gridstate;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = BusinessRole.class, optional = true)
  @JoinColumn(name = "role_id")
  private BusinessRole role;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = Employee.class, optional = true)
  @JoinColumn(name = "globalid_id")
  private Employee employee;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = SoDPolicy.class, optional = true)
  @JoinColumn(name = "policyrule_id")
  private SoDPolicy policyRule;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = Policy.class, optional = true)
  @JoinColumn(name = "policy_id")
  private Policy policy;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = OverlapPolicy.class, optional = true)
  @JoinColumn(name = "overlap_policy_id")
  private OverlapPolicy overlapPolicy;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = ChangeRequest.class, optional = true)
  @JoinColumn(name = "changerequest_id")
  private ChangeRequest changeRequest;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = WfResult.class, optional = true)
  @JoinColumn(name = "wfresult_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
  private WfResult wfResult;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = OrgUnit.class, optional = true)
  @JoinColumn(name = "orgunit_id")
  private OrgUnit orgunit;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = ControleUser.class, optional = true)
  @JoinColumn(name = "controleuser_id")
  private ControleUser controleUser;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = Activity.class, optional = true)
  @JoinColumn(name = "activity_id")
  private Activity activity;

  @ManyToOne(fetch = FetchType.LAZY, targetEntity = ControleUserGroup.class, optional = true)
  @JoinColumn(name = "group_id")
  private ControleUserGroup group;

  @Enumerated(EnumType.STRING)
  @Column(name = "action_code", nullable = true, length = 255)
  private HistoryActionCode historyActionCode;

  // gets ans sets
}


当我跑步时,出现以下异常:

2019-03-06 15:37:14,710 ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Table '_controle_defaultclient_aa_.delegation_rule' doesn't exist
2019-03-06 15:37:14,746 ERROR: de.nexis.controle.dao.db.session.DatabaseThread - id to load is required for loading
java.lang.IllegalArgumentException: id to load is required for loading
  at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:93)
  at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:63)
  at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doGetReference(SessionImpl.java:2884)
  at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$getReference$0(SessionImpl.java:2836)
  at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2860)
  at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.getReference(SessionImpl.java:2836)
  at org.hibernate.internal.SessionImpl.load(SessionImpl.java:1087)
  at de.nexis.controle.dao.dao.genericdaos.GenericHibernateSettingsDAO.findById(GenericHibernateSettingsDAO.java:56)
  at de.nexis.controle.clientmgt.ui.project.CreateProjectWizard$1.runInternal(CreateProjectWizard.java:151)
  at de.nexis.controle.dao.db.session.DatabaseThread.run(DatabaseThread.java:139)


这是Hibernate无法创建的表delegation_rule:

@SuppressWarnings("serial")
@Entity
@Table(name = "delegation_rule")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "main_type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = DelegationRuleTypeString.SIMPLE)
public class DelegationRule implements IIdEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column(name = "main_type", insertable = false, updatable = false)
  private String mainType;

  @Column(name = "idx")
  private int index;

  /**
   * the type of the rule - defines the action
   **/
  @Enumerated(EnumType.STRING)
  @Column(name = "typ")
  private DelegationRuleType type;

  @Column(name = "fall_through")
  private boolean fallThrough;

  // just in case we need some reserved values for later db changes
  @Column(name = "reserved_boolean")
  private boolean reservedBoolean;

  @Column(name = "reserved_integer")
  private int reservedInteger;

  @Column(name = "reserved_long")
  private long reservedLong;

  @Column(name = "reserved_string", columnDefinition = "TEXT")
  private String reservedString;

  @Column(name = "reserved_string_2", columnDefinition = "TEXT")
  private String reservedString2; // end reserved values

  /**
   * a short description of this rule to help the users
   */
  @Column(name = "description", columnDefinition = "TEXT")
  private String description;

  /**
   * the {@link DelegationPath} that this Rule belongs to
   */
  @ManyToOne(optional = true, fetch = FetchType.EAGER)
  @JoinColumn(name = "delegation_path_id")
  private DelegationPath delegationPath;

  // the delegate filter  @ManyToOne  @JoinColumn(name = "employee_attribute_definition")
  private AttributeDefinition employeeAttributeDefinition;

  @Enumerated(EnumType.STRING)
  @Column(name = "employee_operation")
  private DelegationConditionOperation employeeOperation;

  @Column(name = "employee_filter_value", columnDefinition = "TEXT")
  private String employeeFilterValue;

  // --------------- constructors -------------------- //

  public DelegationRule() { // mostly for hibernate   
  }

  public DelegationRule(DelegationRuleType type, String description) {
      this.type = type;
      this.description = description;
  }

  // ---------------- getters and setters -------------------- //

  public String getMainType() {
      return mainType;
  }

  public void setMainType(String mainType) {
      this.mainType = mainType;
  }

  public long getId() {
      return id;
  }

  public void setId(long id) {
      this.id = id;
  }

  public DelegationRuleType getType() {
      return type;
  }

  public void setType(DelegationRuleType type) {
      this.type = type;
  }

  public String getDescription() {
      return description;
  }

  public void setDescription(String description) {
      this.description = description;
  }

  public DelegationPath getDelegationPath() {
      return delegationPath;
  }

  public void setDelegationPath(DelegationPath delegationPath) {
      this.delegationPath = delegationPath;
  }

  public int getIndex() {
      return index;
  }

  public void setIndex(int index) {
      this.index = index;
  }

  public AttributeDefinition getEmployeeAttributeDefinition() {
      return employeeAttributeDefinition;
  }

  public void setEmployeeAttributeDefinition(AttributeDefinition employeeAttributeDefinition) {
      this.employeeAttributeDefinition = employeeAttributeDefinition;
  }

  public DelegationConditionOperation getEmployeeOperation() {
      return employeeOperation;
  }

  public void setEmployeeOperation(DelegationConditionOperation employeeOperation) {
      this.employeeOperation = employeeOperation;
  }

  public String getEmployeeFilterValue() {
      return employeeFilterValue;
  }

  public void setEmployeeFilterValue(String employeeFilterValue) {
      this.employeeFilterValue = employeeFilterValue;
  }

  public boolean isFallThroughEnabled() {
      return fallThrough;
  }

  public void setFallThrough(boolean fallThrough) {
      this.fallThrough = fallThrough;
  }

  public void copyEmployeeFilter(DelegationRule original) {
      employeeAttributeDefinition = original.employeeAttributeDefinition;
      employeeOperation = original.employeeOperation;
      employeeFilterValue = original.employeeFilterValue;
  }
}


大家好,告诉我Hibernate到底出了什么问题。

最佳答案

嗯,问题不在于Hibernate,而是因为您正在使用数据库保留字(例如,索引)作为变量名。修复此问题,它消失了。

关于mysql - 使用MySql 8的Hibernate 5.4.1并非所有表都是自动创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55025769/

相关文章:

mysql - (以今天计算)减去(以前一天计算)持续 1 个月

php - 在模态 PHP、jQuery 中渲染模态的新数据

sql - 无法匹配 UNION 类型 "..."和 "..."

hibernate - Spring Data + Hibernate 查询缓存不起作用

php - 来自数组或逗号分隔的字符串 : get fields from db in just one query

PHP 计算到用户的最短路线(最快?)

MySQL 没有充分利用服务器

.net - Windows 应用程序使用什么数据库?

hibernate - 迁移到 Hibernate 5.x

java - 当 beanType 是接口(interface)时 Validator.validateValue 忽略验证(hibernate-validator-6.0.18)