请考虑以下mySQL表:
CREATE TABLE storeman.user (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(50) NOT NULL,
display_name VARCHAR(50),
password CHAR(32),
...
PRIMARY KEY (id),
UNIQUE INDEX (email)
);
CREATE TABLE storeman.user_preferences (
id INT NOT NULL AUTO_INCREMENT,
notify_login BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (id),
CONSTRAINT fk_user_preferences FOREIGN KEY (id) REFERENCES user (id) ON DELETE CASCADE
);
正如您所看到的,这两个表之间存在一对一的关系。 运行Hibernate代码生成器时,我得到了以下内容(仅限相关部分)
@Entity
@Table(name = "user", catalog = "storeman", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User implements java.io.Serializable {
...
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
public UserPreferences getUserPreferences(){
return this.userPreferences;
};
...
}
问题是当我保存用户实体时,链接的UserPreferences不会自动保存。解决这个问题很容易:
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
@Cascade({CascadeType.ALL})
public UserPreferences getUserPreferences(){
return this.userPreferences;
};
但是,如果由于任何原因我将不得不重新运行Hibernate代码生成器,@Cascade({CascadeType.ALL})
将会消失,这很危险,因为我依赖链接表是自动的这一事实保存在我的代码中。
所以问题是:有没有办法在顶层修改mySQL脚本,以便在运行hibernate逆向工程代码生成时自动添加@Cascade注释?
答案 0 :(得分:1)
mySql物理表并没有说出除了外键之外的级联。只有它可以添加ON DELETE CASCADE ON DELETE UPDATE。
然后你运行Hibernate Code Generator,CascadeType和@Cascade定义都没有翻译成DDL
尝试尽可能多地使用jpa注释。
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user",cascade= CascadeType.ALL)
public UserPreferences getUserPreferences(){
return this.userPreferences;
};