【问题标题】:which generated class is using for string type primary key in hibernate java? or any need of generator class for string type哪个生成的类用于hibernate java中的字符串类型主键?或任何需要字符串类型的生成器类
【发布时间】:2017-02-03 05:35:53
【问题描述】:

Hibernate Java 中哪个生成的类用于 String 类型的主键?还是需要字符串类型的生成器类?

使用更新时出现错误

org.hibernate.StaleStateException:批量更新返回意外 来自更新 [0] 的行数;实际行数:0;预计:1

这是我的实体类 Book.java

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
//import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.springframework.format.annotation.DateTimeFormat;
@Entity
@Table(name="book1")
public class Book {

    @Id
    @Column(unique=true,length=20)
    private String ACC_NO;
    private String CALL_NO;
    private String AUTHOR;
    private String TITLE;
    private String IMPRINT;
    private String YEAR;
    private String EDITION;
    private String SUBJECT;
    private String SERIES;
    private String PAGES;
    @DateTimeFormat(pattern="mm/dd/yyyy")
    private Date DATE_RELEASE;
    private String BOOK_STATUS;
    private Byte RESER_STATUS;
    public String getACC_NO() {
        return ACC_NO;
    }
    public void setACC_NO(String aCC_NO) {
        ACC_NO = aCC_NO;
    }
    public String getCALL_NO() {
        return CALL_NO;
    }
    public void setCALL_NO(String cALL_NO) {
        CALL_NO = cALL_NO;
    }
    public String getAUTHOR() {
        return AUTHOR;
    }
    public void setAUTHOR(String aUTHOR) {
        AUTHOR = aUTHOR;
    }
    public String getTITLE() {
        return TITLE;
    }
    public void setTITLE(String tITLE) {
        TITLE = tITLE;
    }
    public String getIMPRINT() {
        return IMPRINT;
    }
    public void setIMPRINT(String iMPRINT) {
        IMPRINT = iMPRINT;
    }
    public String getYEAR() {
        return YEAR;
    }
    public void setYEAR(String yEAR) {
        YEAR = yEAR;
    }
    public String getEDITION() {
        return EDITION;
    }
    public void setEDITION(String eDITION) {
        EDITION = eDITION;
    }
    public String getSUBJECT() {
        return SUBJECT;
    }
    public void setSUBJECT(String sUBJECT) {
        SUBJECT = sUBJECT;
    }
    public String getSERIES() {
        return SERIES;
    }
    public void setSERIES(String sERIES) {
        SERIES = sERIES;
    }
    public String getPAGES() {
        return PAGES;
    }
    public void setPAGES(String pAGES) {
        PAGES = pAGES;
    }
    public String getBOOK_STATUS() {
        return BOOK_STATUS;
    }
    public void setBOOK_STATUS(String bOOK_STATUS) {
        BOOK_STATUS = bOOK_STATUS;
    }
    public Byte getRESER_STATUS() {
        return RESER_STATUS;
    }
    public void setRESER_STATUS(Byte rESER_STATUS) {
        RESER_STATUS = rESER_STATUS;
    }
    public Date getDATE_RELEASE() {
        return DATE_RELEASE;
    }
    public void setDATE_RELEASE(Date dATE_RELEASE) {
        DATE_RELEASE = dATE_RELEASE;
    }
}


**Update command in BookDAOImpl.java is below use for both save and Update**

@Override
    @Transactional
    public void saveBook(Book Book) {
        sessionFactory.getCurrentSession().saveOrUpdate(Book);
    }

【问题讨论】:

  • 能否提供实体类和代码用于更新?
  • 我不知道这是否是问题所在,但您的 saveBook 方法中有错字 - (Book Book) 应该是 (Book book),您应该在 sessionFactory 中以小写形式保存您的书。
  • 您的班级成员的命名也不太符合 java 标准。您不应该使用大写来命名变量成员。 oracle.com/technetwork/java/codeconventions-135099.html
  • 感谢您的建议。我只是chaged。我的问题是我们是否需要一个字符串主键的生成器类

标签: java hibernate


【解决方案1】:

对于基于字符串的主键,您有两种选择:

  • 使用其中一个 UUID 生成器将生成的 UUID 存储为字符串。
  • 编写您自己的基于字符串的自定义生成器。

Hibernate 中的其他生成器主要处理从特定于表的IDENTITYAUTO_INCREMENT 列或由数据库的序列支持或自定义hibernate_sequences 表提供的SEQUENCE 获得的数值。

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 2016-03-18
    • 1970-01-01
    • 2013-05-09
    • 2019-10-02
    • 1970-01-01
    • 2021-11-05
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多