在这篇文章中,我们将为您详细介绍在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绕过过滤)
- @Embeddable中具有@GeneratedValue的@EmbeddedId
- @GeneratedValue(strategy = GenerationType.AUTO)无法正常工作
- @GeneratedValue(strategy =“ IDENTITY”)与@GeneratedValue(strategy =“ SEQUENCE”)
- @TableGenerator的initialValue属性在Hibernate中显示问题,但在JPA中未显示
在Hibernate中绕过GeneratedValue(invokefunction绕过过滤)
是否有可能绕过@GeneratedValue
Hibernate中的ID,在大多数情况下,我们希望使用来设置IDGeneratedValue
,但在某些情况下希望手动设置ID。
这可能吗?
答案1
小编典典我知道您可以在JPA规范中执行此操作,因此您应该能够在Hibernate中(使用JPA +批注)。
如果仅填写要创建的新持久性模型的ID字段,那么当您将该模型“合并”到EntityManager中时,它将使用您设置的ID。
但是,这确实有后果。您刚刚用完了该ID,但是GeneratedValue批注指定的序列不知道这一点。除非您指定一个比当前序列值少的未使用的ID,否则一旦序列追上您刚刚使用的值,您将遇到问题。
因此,也许我可以看到您可能希望用户在哪里指定ID,但是您需要捕获将来可能出现的异常(重复ID)。
@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@GeneratedValue
并
OPERATION.id_menu从中传播。我能正确解释情况吗?
MENU.id_menu,butdoes
not support
in`
我尝试使用NetBeans 从DataBase 选项的 Entity类 的 “建议”
,但是为具有简单列的标识符(如)的表生成注释,而不为组合对象的表(如)生成注释。 __@GeneratedValue``MENU``OPERATION
所以问题是 我该如何进行映射? 。更改数据库的结构不是一种选择,因为业务需要,所以要这样做。
任何帮助或指导表示赞赏。提前非常感谢您。
@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”)
我是新来的hibernate。我不了解以下两种主要的密钥生成策略:
- 身分识别
- 序列
有人可以解释这两个是如何工作的,两者之间有什么区别?
答案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中未显示
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中绕过GeneratedValue和invokefunction绕过过滤的分享已经结束,谢谢您的关注,如果想了解更多关于@Embeddable中具有@GeneratedValue的@EmbeddedId、@GeneratedValue(strategy = GenerationType.AUTO)无法正常工作、@GeneratedValue(strategy =“ IDENTITY”)与@GeneratedValue(strategy =“ SEQUENCE”)、@TableGenerator的initialValue属性在Hibernate中显示问题,但在JPA中未显示的相关知识,请在本站进行查询。
本文标签: