如何在springboot hibernate中使用@IdClass在复合主中生成序列id
我正在SpringBootHibernate中实现一个带有自动生成注释的复合主键。以下是场景:如何在springboot hibernate中使用@IdClass在复合主中生成序列id,hibernate,jpa,autogeneratecolumn,Hibernate,Jpa,Autogeneratecolumn,我正在SpringBootHibernate中实现一个带有自动生成注释的复合主键。以下是场景: 科目表包含以下列: stateCode、branchCode、prodCode、subdocode、accountNumber 每当stateCode、branchCode、prodCode和SubCode发生更改时,表Account都应该有新的accountNumber 例如: stateCode,branchCode,prodCode,subProdCode,accountNumber 11,01
stateCode、branchCode、prodCode、subdocode、accountNumber
stateCode,branchCode,prodCode,subProdCode,accountNumber
11,01,20,1,00001
11,01,30,1,00001 (there is a change in prodCode)
11,01,30,2,00001 (there is a change in subprodcode)
11,01,20,2,00001 (there is a change in prod & subprodcode)
11,01,20,1,00002 (prodcode,subprod code has already account number 00001 ,
now it should be 00002)
同样的问题已经发布在但是我想知道,最新版本的spring boot hibernate是否引入了任何新功能 下面是我已经实现的代码:
@实体
@资料
@AllArgsConstructor
@诺尔格构装师
@EqualsAndHashCode(callSuper=false)
@IdClass(CompositeId.class)
公共类复合计数{
私人城市;
私有字符串名称;
@身份证
@生成值
私人长途电话号码;
@身份证
私有字符串状态码;
@身份证
私有字符串分支代码;
@身份证
私有字符串代码;
@身份证
私有字符串子代码;
}
@资料
@AllArgsConstructor
@诺尔格构装师
@EqualsAndHashCode(callSuper=false)
公共类CompositeId实现可序列化{
私有字符串状态码;
私有字符串分支代码;
私有字符串代码;
私有字符串子代码;
私人长途电话号码;
}
我使用上述代码得到以下结果:
stateCode,branchCode,prodCode,subProdCode,accountNumber
11,01,20,1,00001
11,01,30,1,00002
11,01,30,2,00003
11,01,20,2,00004
11,01,20,1,00005
看看,它本质上允许您在生成序列值时访问实体实例和Hibernate的
会话。通过这种方式,您可以查询表中是否存在要插入的其他(未生成的)键的组合,并相应地执行操作 在当前项目中,我也遇到了同样的问题,但在花了几个小时之后。这对我很有效,这也会很有帮助
如果与您的场景不相关,请注释掉@GenericGenerator行。(在我的例子中,GenericGenerator实现类在键字段中插入序列之前追加字符串。)
客户实体包含一个复合主键(经理id+客户id)
ClientId-复合密钥实体。
public class ClientId implements Serializable {
private String clientId;
private String managerId;
// Getter and Setter
}
和管理性-
@Entity(name = "portfolioManager")
@Table(name = "portfolio_manager")
public class ManagerEntity implements Serializable {
@Id
@Column(name = "manager_id",length = 50,nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PORTFOLIO_MANAGER_SEQ")
@GenericGenerator(
name = "PORTFOLIO_MANAGER_SEQ",
strategy = "com.abc.api.utils.StringPrefixedSequenceIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "MNG"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%06d") })
private String managerId;
@Column(name = "manager_name",length = 100)
private String managerName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "manager")
protected List<ClientEntity> clients = new ArrayList<>();
@Entity(name=“portfolioManager”)
@表(name=“投资组合经理”)
公共类ManagerEntity实现了可序列化{
@身份证
@列(name=“manager\u id”,长度=50,可空=false)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“投资组合经理”)
@通用生成器(
name=“投资组合经理”,
strategy=“com.abc.api.utils.StringPrefixedSequenceIdGenerator”,
参数={
@org.hibernate.annotations.Parameter(name=StringPrefixedSequenceIdgeGenerator.INCREMENT_PARAM,value=“50”),
@org.hibernate.annotations.Parameter(name=StringPrefixedSequenceIdgeGenerator.VALUE_PREFIX_参数,VALUE=“MNG”),
@org.hibernate.annotations.Parameter(name=StringPrefixedSequenceIdgeGenerator.NUMBER_FORMAT_参数,value=“%06d”)})
私有字符串管理器;
@列(name=“manager\u name”,长度=100)
私有字符串管理器名称;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“manager”)
受保护的列表客户端=新的ArrayList();
@Entity(name = "portfolioManager")
@Table(name = "portfolio_manager")
public class ManagerEntity implements Serializable {
@Id
@Column(name = "manager_id",length = 50,nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PORTFOLIO_MANAGER_SEQ")
@GenericGenerator(
name = "PORTFOLIO_MANAGER_SEQ",
strategy = "com.abc.api.utils.StringPrefixedSequenceIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.INCREMENT_PARAM, value = "50"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "MNG"),
@org.hibernate.annotations.Parameter(name = StringPrefixedSequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%06d") })
private String managerId;
@Column(name = "manager_name",length = 100)
private String managerName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "manager")
protected List<ClientEntity> clients = new ArrayList<>();