【问题标题】:Map autoIncrement non-primary key in hibernate在休眠中映射autoIncrement非主键
【发布时间】:2019-01-09 01:15:18
【问题描述】:

我有一个教师表,其中包含一个主键 TEACHER_UNIQUE_ID,以及另一个具有索引 TEACHER_ID 的 autoIncrement 键。 现在我必须将 autoIncrement 键映射到其他表,即 SUBJECT 。我使用了下面的代码,但这总是在主题类中将 TEACHER_ID 设置为 null。

我希望它插入具有实际 autoIncremented TEACHER_ID 的主题表。

public class Teacher {

@Id  
@Column(name = "TEACHER_UNIQUE_ID")  
private String teacherUniqueId;

@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "TEACHER_ID", unique = true)
private Long teacherId;
-----
-----
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="teacher" ,orphanRemoval = true)
@Fetch(FetchMode.SELECT)
@MapKey(name = "fieldName")
private Map<String, subject> subjectInfo  = new HashMap<>(0); 

public Long getTeacherUniqueId() {
    return teacherUniqueId;
}
public void setTeacherUniqueId(Long teacherUniqueId) {
    this.teacherUniqueId = teacherUniqueId;
}

public Long getTeacherId() {
    return teacherId;
}
public void setTeacherId(Long teacherId) {
    this.teacherId = teacherId;
}

private void setField(String key, String value) {
    subject subjectInfoData = subjectInfo.get(key);
    if(subjectInfoData == null){
        subjectInfoData = new subject();
        subjectInfoData.setFieldName(key);                  
        subjectInfo.put(key, subjectInfoData);
    }
    subjectInfoData.setTeacher(this);
    **subjectInfoData.setId(this.getTeacherId());**  -- its inserting null to id in SUBJECT table. i want it to insert actual TEACHER_ID got from TEACHER Table.
    subjectInfoData.setFieldValue(value);
    setAdditionalInfo(subjectInfo);
}

public String getCustomFieldValue(String fieldName) {
    return subjectInfo.get(fieldName)!=null?subjectInfo.get(fieldName).getFieldValue():null;
}
public void setCustomFieldValue(String fieldName, String fieldValue) {
    setField(fieldName, fieldValue);
}

public Map<String, Subject> getAdditionalInfo() {
    return subjectInfo;
}

public void setAdditionalInfo(Map<String, Subject> subjectInfo) {
    this.subjectInfo = subjectInfo;
}

}

除了 TEACHER_ID 之外的其他值正在正确插入。

我试过了

@GenericGenerator(name="generator", strategy="increment")
@GeneratedValue(generator="generator")
@Column(name = "TEACHER_ID", unique = true)
private Long teacherId;

还有这个

@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "TEACHER_ID", unique = true)
private Long teacherId;

运气不好。谁能告诉我我在这里缺少什么。

【问题讨论】:

  • 您的数据库中的 TEACHER_ID 字段是否设置为自动增量?
  • @Harry Coder 是的,TEACHER_ID 在 DB 中设置为自动递增。

标签: java spring-mvc annotations hibernate-mapping


【解决方案1】:

要解决这个问题: “我希望它插入具有实际 autoIncremented TEACHER_ID 的主题表。”

我建议在数据库中保留一个序列对象以手动跟踪增量。

使用 Hibernate 自动生成 ID:

1) 在您的数据库开发人员(SQL 开发人员)中创建一个序列对象。

2) 将此代码添加到 id 变量中:

       @Id
       @Column(name = "ID")
       @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ONE")
       @SequenceGenerator(name = "ONE", sequenceName = "ONE", allocationSize =1)
       int id;

3) ‘ONE’是序列的名称,我已经创建了你可以随意命名它,分配大小是数字的增量。

4) 将值插入数据库(教师 ID)时,发送 0 代替 Id,Hibernate 将自动转换序列号中的值。 现在您可以使用这个数字来填充主题表。

注意:在教师表中插入新对象时会返回 ID。使用该 ID,您可以填充主题表。有时最好用旧方法而不是使用 spring 已经提供的注释。

希望这可以节省您的时间!

【讨论】:

  • 在您的代码中我看到@\Id,它用于主键。我想设置非主键的自动编号。
  • Hibernate 在一个 bean/table 映射中只能有一个主键自动递增。因此,您需要保留一个序列来跟踪数字,然后将其添加到您需要的列中。映射序列和列的方式:(stackoverflow.com/questions/6386888/…) 看看这是否可行,我会在此期间尝试寻找其他方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2011-07-26
  • 2011-02-10
  • 2018-06-12
  • 2022-10-05
  • 1970-01-01
相关资源
最近更新 更多