JPA @EmbeddedId 不生成序列

标签 jpa auto-generate

我有一个表,其中包含一个序列和两个外键的复合主键
我能够持久化我的实体类,但它没有按照顺序生成。由一个序列和两个外键组成的复合主键的表,maven中的hbm2java给出了以下实体

这是主要实体
package aop.web.teacher.rmodels; // Generated Dec 14, 2010 8:45:32 PM by Hibernate Tools 3.2.2.GA import java.util.Date; import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; /** * Schoolmaster generated by hbm2java */ @Entity @Table(name = "schoolmaster", schema = "public") public class Schoolmaster implements java.io.Serializable { private SchoolmasterId id; ... @EmbeddedId @AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "id", nullable = false)), @AttributeOverride(name = "districtId", column = @Column(name = "district_id", nullable = false)), @AttributeOverride(name = "typeOfSchool", column = @Column(name = "type_of_school", nullable = false)) }) public SchoolmasterId getId() { return this.id; } public void setId(SchoolmasterId id) { this.id = id; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "type_of_school", nullable = false, insertable = false, updatable = false) public AopTeachersTypeMaster getAopTeachersTypeMaster() { return this.aopTeachersTypeMaster; } public void setAopTeachersTypeMaster( AopTeachersTypeMaster aopTeachersTypeMaster) { this.aopTeachersTypeMaster = aopTeachersTypeMaster; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "school_nature") public AopTeachersSchoolNatureMaster getAopTeachersSchoolNatureMaster() { return this.aopTeachersSchoolNatureMaster; } public void setAopTeachersSchoolNatureMaster( AopTeachersSchoolNatureMaster aopTeachersSchoolNatureMaster) { this.aopTeachersSchoolNatureMaster = aopTeachersSchoolNatureMaster; } @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "district_id", nullable = false, insertable = false, updatable = false) public AopTeachersDistrictMaster getAopTeachersDistrictMaster() { return this.aopTeachersDistrictMaster; } public void setAopTeachersDistrictMaster( AopTeachersDistrictMaster aopTeachersDistrictMaster) { this.aopTeachersDistrictMaster = aopTeachersDistrictMaster; } @Column(name = "school_name", length = 50) public String getSchoolName() { return this.schoolName; } public void setSchoolName(String schoolName) { this.schoolName = schoolName; } @Column(name = "school_address") public String getSchoolAddress() { return this.schoolAddress; } public void setSchoolAddress(String schoolAddress) { this.schoolAddress = schoolAddress; } @Column(name = "school_phone_number", length = 12) public String getSchoolPhoneNumber() { return this.schoolPhoneNumber; } public void setSchoolPhoneNumber(String schoolPhoneNumber) { this.schoolPhoneNumber = schoolPhoneNumber; } @Temporal(TemporalType.DATE) @Column(name = "establishment_date", length = 13) public Date getEstablishmentDate() { return this.establishmentDate; } public void setEstablishmentDate(Date establishmentDate) { this.establishmentDate = establishmentDate; } @Column(name = "school_no_of_teachers") public Integer getSchoolNoOfTeachers() { return this.schoolNoOfTeachers; } public void setSchoolNoOfTeachers(Integer schoolNoOfTeachers) { this.schoolNoOfTeachers = schoolNoOfTeachers; } @Column(name = "school_no_of_students") public Integer getSchoolNoOfStudents() { return this.schoolNoOfStudents; } public void setSchoolNoOfStudents(Integer schoolNoOfStudents) { this.schoolNoOfStudents = schoolNoOfStudents; } }
这是嵌入式PK类。
/** * SchoolmasterId generated by hbm2java */ @Embeddable public class SchoolmasterId implements java.io.Serializable { private long id; private long districtId; private long typeOfSchool; public SchoolmasterId() { } public SchoolmasterId(long id, long districtId, long typeOfSchool) { this.id = id; this.districtId = districtId; this.typeOfSchool = typeOfSchool; } @Column(name="id", nullable=false) @GeneratedValue(strategy=GenerationType.SEQUENCE) public long getId() { return this.id; } public void setId(long id) { this.id = id; } @NaturalId @Column(name="district_id", nullable=false) public long getDistrictId() { return this.districtId; } public void setDistrictId(long districtId) { this.districtId = districtId; } @NaturalId @Column(name="type_of_school", nullable=false) public long getTypeOfSchool() { return this.typeOfSchool; } public void setTypeOfSchool(long typeOfSchool) { this.typeOfSchool = typeOfSchool; } public boolean equals(Object other) { if ( (this == other ) ) return true; if ( (other == null ) ) return false; if ( !(other instanceof SchoolmasterId) ) return false; SchoolmasterId castOther = ( SchoolmasterId ) other; return (this.getId()==castOther.getId()) && (this.getDistrictId()==castOther.getDistrictId()) && (this.getTypeOfSchool()==castOther.getTypeOfSchool()); } public int hashCode() { int result = 17; result = 37 * result + (int) this.getId(); result = 37 * result + (int) this.getDistrictId(); result = 37 * result + (int) this.getTypeOfSchool(); return result; } }
在这里,我希望自动生成 Id...
我只添加了
@NaturalId

@GeneratedValue(strategy=GenerationType.SEQUENCE)
我也试过 GenerationType.AUTO
但没有用。
请建议。

最佳答案

此问题有一种解决方法。我遇到了同样的情况,有 4 个字段作为复合键,其中 1 个需要按顺序生成。
我根本没有创建嵌入式类,只有 1 个需要按顺序生成的 @Id 字段。其余所有字段值将是简单列,因为在 DB 中强制执行参照完整性,而且我正在检查代码中其余 3 个字段的值是否为空。

如果出现错误,事务将回滚。

关于JPA @EmbeddedId 不生成序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4446991/

相关文章:

java - 自动增量字段不返回值(非主键) - Spring boot JPA

java - hibernate 零对一

python - 使用 nltk 通过 n-gram 模型创建新句子

c# - 在 linq 的帮助下顺序自动生成的 Id

.NET 从运行代码生成序列图

java - 通过 Hibernate 注解创建外键关系的问题

java - 使用 Hibernate 的存储过程在嵌入式 h2 数据库中失败

java - 我无法定义如何在其他表的实体类中映射两个不同表的两个外键列

git - 让 git 跟踪自动生成的文件,但忽略 diff

c# - 空的 getter 和 setter 有什么意义,因此在 c# 中自动生成 getter 和 setter 有什么意义