HiLo generator strategy not working

一笑奈何 提交于 2019-12-02 23:17:33

Hilo is not supported anymore, this should work

@GenericGenerator(name="sequence-gen",strategy="sequence")

If we are using mysql it would be better to use the @GenericGenerator of increment strategy.

  1. sequence - This sort of strategy supports by Oracle, Postgresql.
  2. increment - This sort of strategy supports by MySql.

    @ElementCollection
    @JoinTable(name="USER_ADDRESS", joinColumns=@JoinColumn(name="USER_ID"))
    @GenericGenerator(name = "increment-gen", strategy = "increment")
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "increment-gen", type = @Type(type="long"))
    private Collection<Address> listOfAddress = new ArrayList<>();
    

When I have used the sequence strategy with MySql I came across an issue where my ADDRESS_ID is not getting incremented properly.

The Support for 'hilo' generator has been removed. For additional information, this link gives you the deprecated list.

To overcome this, you can simply use sequence generator. This will solve your problem.

@Entity
@Table(name = "USER_DETAILS")
public class UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;
    private String userName;

    @ElementCollection
    @JoinTable(name="USER_ADDRESS",
        joinColumns=@JoinColumn(name="USER_ID")
    )

    @GenericGenerator(name = "sequence-gen", strategy = "sequence")
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "sequence-gen", type = @Type(type="long"))
    private Collection<Address> address = new ArrayList<Address>();

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Collection<Address> getAddress() {
        return address;
    }

    public void setAddress(List<Address> address) {
        this.address = address;
    }
}

You must choose from one of the Hi/Lo strategy :

To be as close as your tutorial as possible, I would simply change "hilo" to "seqhilo" in your code.

I would recommend you to try any of the below 2 solutions and it will fix your issue. it is as per the specification provided in Hibernate 5.2.X.

Source Of Info -https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html

Solution 1 -

 @GenericGenerator(name = "product_generator",strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator")
 @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "product_generator", type = @Type(type="long"))*

Solution 2 -

*@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "product_generator")
 @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "product_generator", type = @Type(type="long"))*

Let me know if it helps you.

FYI, MYSQL supports sequence strategy however table name should not contain hyphen '-' (which is name provided in @GenericGenerator(name) could cause DDL exception while creating sequence table in mysql.

This is what works for apps on PostgreSQL. Though I have not tested it, it should work for all DBs. Note that increment-gen is used not sequence.

@ElementCollection
    @JoinTable( name = "user_address", joinColumns = @JoinColumn( name = "user_id"))
    @GenericGenerator(name="increment-gen",strategy="increment")
    @CollectionId( columns = { @Column( name ="address_id") }, generator ="increment-gen", type =@Type( type ="long"))
    private Collection<Address> listOfAddresses = new ArrayList<Address>();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!