GVKun编程网logo

在Hibernate中绕过GeneratedValue(invokefunction绕过过滤)

3

在这篇文章中,我们将为您详细介绍在Hibernate中绕过GeneratedValue的内容,并且讨论关于invokefunction绕过过滤的相关问题。此外,我们还会涉及一些关于@Embeddabl

在这篇文章中,我们将为您详细介绍在Hibernate中绕过GeneratedValue的内容,并且讨论关于invokefunction绕过过滤的相关问题。此外,我们还会涉及一些关于@Embeddable中具有@GeneratedValue的@EmbeddedId、@GeneratedValue(strategy = GenerationType.AUTO)无法正常工作、@GeneratedValue(strategy =“ IDENTITY”)与@GeneratedValue(strategy =“ SEQUENCE”)、@TableGenerator的initialValue属性在Hibernate中显示问题,但在JPA中未显示的知识,以帮助您更全面地了解这个主题。

本文目录一览:

在Hibernate中绕过GeneratedValue(invokefunction绕过过滤)

在Hibernate中绕过GeneratedValue(invokefunction绕过过滤)

是否有可能绕过@GeneratedValueHibernate中的ID,在大多数情况下,我们希望使用来设置ID
GeneratedValue,但在某些情况下希望手动设置ID。

这可能吗?

答案1

小编典典

我知道您可以在JPA规范中执行此操作,因此您应该能够在Hibernate中(使用JPA +批注)。

如果仅填写要创建的新持久性模型的ID字段,那么当您将该模型“合并”到EntityManager中时,它将使用您设置的ID。

但是,这确实有后果。您刚刚用完了该ID,但是GeneratedValue批注指定的序列不知道这一点。除非您指定一个比当前序列值少的未使用的ID,否则一旦序列追上您刚刚使用的值,您将遇到问题。

因此,也许我可以看到您可能希望用户在哪里指定ID,但是您需要捕获将来可能出现的异常(重复ID)。

@Embeddable中具有@GeneratedValue的@EmbeddedId

@Embeddable中具有@GeneratedValue的@EmbeddedId

我有一个具有以下结构的MySQL数据库(节选):

CREATE TABLE MENU(
    id_menu    TINYINT      UNSIGNED    NOT NULL    AUTO_INCREMENT,name       VARCHAR(50)              NOT NULL,PRIMARY KEY (id_menu)
);

CREATE TABLE OPERATION(
    id_operation    SMALLINT        UNSIGNED    NOT NULL    AUTO_INCREMENT,id_menu         TINYINT         UNSIGNED    NOT NULL,operation       VARCHAR(50)                 NOT NULL,url             VARCHAR(100)                NOT NULL,PRIMARY KEY (id_operation,id_menu)
);

CREATE TABLE operation_role(
    id_operation    SMALLINT    UNSIGNED    NOT NULL,id_menu         TINYINT     UNSIGNED    NOT NULL,role            CHAR(15)                NOT NULL,id_user         BIGINT      UNSIGNED    NOT NULL,id_menu,role,id_user)
);

CREATE TABLE role_user(
    role          CHAR(15)              NOT NULL
    id_user       BIGINT      UNSIGNED  NOT NULL,PRIMARY KEY (role,id_user)
);

-- RELATIONSHIPS

-- 
-- TABLE: OPERATION 
-- Meaning: a MENU has several OPERATION (One to Many relationship)
ALTER TABLE OPERACION ADD CONSTRAINT fk_menu_operacion 
    FOREIGN KEY (id_menu)
    REFERENCES MENU(id_menu);

-- 
-- TABLE: operation_rol 
-- This is the join table for the Many to Many relatioship OPERATION-role_user
ALTER TABLE operation_role ADD CONSTRAINT fk_operation_oprole 
    FOREIGN KEY (id_operation,id_menu)
    REFERENCES OPERATION(id_operation,id_menu);

ALTER TABLE operaciones_rol ADD CONSTRAINT fk_roles_operation 
    FOREIGN KEY (role,id_user)
    REFERENCES role_user(role,id_user);

-- 
-- TABLE: roles_usuario 
-- Meaning: a user can have several roles (One to Many)
ALTER TABLE roles_usuario ADD CONSTRAINT fk_usuario_roles 
    FOREIGN KEY (id_usuario)
    REFERENCES USUARIO(id_usuario);

另外,还有一个USER表,但这并不重要,有了这些表,您可以了解问题的全貌。

如您所见,某些列具有AUTO_INCREMENT@GeneratedValue(strategy = GenerationType.IDENTITY)@Entity类中变为的属性。

OPERATION并且role_user由于它们与其他表的关系而具有复合主键,因此我无法更改。由于为Composite
PK,因此映射的类必须具有一个@EmbeddedId带有相应@Embeddable类的。

问题是我需要@GeneratedValue在组合的 “本机”
部分中添加一个PK,例如:OPERATION.id_operation必须具有JPA @GeneratedValue @ EmbeddedId@GeneratedValueOPERATION.id_menu从中传播。我能正确解释情况吗?MENU.id_menu,butdoes not supportin`

我尝试使用NetBeans 从DataBase 选项的 Entity类“建议”
,但是为具有简单列的标识符(如)的表生成注释,而不为组合对象的表(如)生成注释。 __@GeneratedValue``MENU``OPERATION

所以问题是 我该如何进行映射? 。更改数据库的结构不是一种选择,因为业务需要,所以要这样做。

任何帮助或指导表示赞赏。提前非常感谢您。

@GeneratedValue(strategy = GenerationType.AUTO)无法正常工作

@GeneratedValue(strategy = GenerationType.AUTO)无法正常工作

我正在尝试将对象持久化到数据库。不断获取“列ID无法接受空值错误”。我的对象看起来像这样:

    @Entitypublic class TestTable {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Integer id = 0;    @Column(nullable=false, length=256)    private String data = "";    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getData() {        return data;    }    public void setData(String data) {        this.data = data;    }}

我的持久功能:

public static synchronized boolean persistObject(Object obj){        boolean success = true;        EntityManager em = null;        EntityTransaction tx = null;        try{            em = getEmf().createEntityManager();            tx = em.getTransaction();            tx.begin();            em.persist(obj);            tx.commit();        } catch (Exception e){            success = false;        } finally{            try{                em.close();            } catch(Exception e){                //nothing            }        }        return success;    }

答案1

小编典典

您可以使用GenerationType.TABLE。这样,jpa将序列表用于ID分配,您可能永远不需要生成序列或自动递增值或触发可移植性的触发器。

另请注意,在java中,int类型默认使用0初始化,因此您也可以摆脱它。

@GeneratedValue(strategy =“ IDENTITY”)与@GeneratedValue(strategy =“ SEQUENCE”)

@GeneratedValue(strategy =“ IDENTITY”)与@GeneratedValue(strategy =“ SEQUENCE”)

我是新来的hibernate。我不了解以下两种主要的密钥生成策略:

  1. 身分识别
  2. 序列

有人可以解释这两个是如何工作的,两者之间有什么区别?

答案1

小编典典

引用Java持久性/标识和排序:

身份 排序使用数据库中的 特殊IDENTITY列 来允许数据库在插入对象的行时自动为其分配ID。许多数据库(例如
MySQL,DB2,SQL Server,Sybase和Postgres)
都支持标识列。Oracle不支持IDENTITY列,但是可以使用序列对象和触发器来模拟它们。

用简单的英语来说:您最多ID将表中的一列标记为IDENTITY。数据库引擎将自动为您输入 下一个可用 值。

和:

序列 对象使用 特殊的数据库对象 来生成ID。仅某些数据库(例如 Oracle,DB2和Postgres)
支持序列对象。通常,SEQUENCE对象具有名称,INCREMENT和其他数据库对象设置。每次<sequence>.NEXTVAL选择时,序列都会增加INCREMENT。

序列更灵活,稍微复杂一些。您可以在数据库中的表,触发器等旁边定义一个额外的对象,称为 sequence
。序列基本上被称为计数器,您可以在查询中的任何地方使用。

@TableGenerator的initialValue属性在Hibernate中显示问题,但在JPA中未显示

@TableGenerator的initialValue属性在Hibernate中显示问题,但在JPA中未显示

package com.sb.firstjpaexample.pojo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;

  @Entity
  @Table(name = "EMPLOYEE")
  public class Employee {

@Id
@TableGenerator(name = "TABLE_GEN",table = "SEQUENCE_TABLE",pkColumnName = "SEQ_NAME",valueColumnName = "SEQ_COUNT",pkColumnValue = "EMP_SEQ",initialValue = 1001,allocationSize = 5)
@GeneratedValue(strategy = GenerationType.TABLE,generator = "TABLE_GEN")
private int employeeId;

@Column
private String employeeName;
@Column
private String designation;
@Column
private double salary;

public int getEmployeeId() {
    return employeeId;
}

public void setEmployeeId(int employeeId) {
    this.employeeId = employeeId;
}

public String getEmployeeName() {
    return employeeName;
}

public void setEmployeeName(String employeeName) {
    this.employeeName = employeeName;
}

public String getDesignation() {
    return designation;
}

public void setDesignation(String designation) {
    this.designation = designation;
}

public double getSalary() {
    return salary;
}

public void setSalary(double salary) {
    this.salary = salary;
}

}

“此POJO在JPA中将初始值为1001,在Hibernate中为1作为初始值”还有一个疑问,如何在此处使用注释设置增量步长在JPA中,当我使用增量策略时,它没有问题,但是增量问题

请帮助我,在此先感谢

今天的关于在Hibernate中绕过GeneratedValueinvokefunction绕过过滤的分享已经结束,谢谢您的关注,如果想了解更多关于@Embeddable中具有@GeneratedValue的@EmbeddedId、@GeneratedValue(strategy = GenerationType.AUTO)无法正常工作、@GeneratedValue(strategy =“ IDENTITY”)与@GeneratedValue(strategy =“ SEQUENCE”)、@TableGenerator的initialValue属性在Hibernate中显示问题,但在JPA中未显示的相关知识,请在本站进行查询。

本文标签: