自定义标识符生成器 returns 空

Custom IdentifierGenerator returns null

所以,我想用 IdentifierGenerator 为“FriendID”自定义 ID,我想先让它尽可能简单,以确保它能正常工作。一直在看教程和代码示例,但我无法让它工作,即使它看起来很简单......可能是我错过了什么?

它似乎没有到达策略参数中的 GenFriendID-class,因为生成器 class 名称是灰色的并且显示“Class 'GenFriendID'从未使用过”。路径应该是正确的,并一直在尝试将它们移动到同一个包等等。

也一直在尝试删除数据库并根据更改重新运行数据库的创建(之前是 GenerationType.AUTO)

实体 class,

package com.WineOutBE.entity;

import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "FriendID")
public class FriendID implements Serializable {

    @Id
    @GenericGenerator(name = "friend_id", strategy = "com.WineOutBE.generator.GenFriendID")
    @GeneratedValue(generator = "friend_id")
    @Column(name = "FriendID", unique = true, length = 6)
    private Long friendid;

    public Long getId() {
        return friendid;
    }

    public void setId(Long FID) {
        this.friendid = FID;
    }
}

实现 IdentifierGenerator 的生成器 class,

package com.WineOutBE.generator;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

import java.io.Serializable;

public class GenFriendID implements IdentifierGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
            return 1234L;
    }
}

returns NULL 而不是 1234 的测试方法,

package com.WineOutBE;

import com.WineOutBE.entity.FriendID;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;


class Testing {

    FriendID friendID;

    @Test
    void checkCorrectIdValue(){
        friendID = new FriendID();

        assertEquals(1234L, friendID.getId());
    }
}

如果您需要查看任何其他代码,请告诉我,我会更新 post! 提前致谢!

如果您将实体写入数据库,Id 生成将起作用

如果你执行简单 friendID = new FriendID(); 它不会工作

使用 EntityManager.merge od spring 将 friendID 保存到数据库,然后保存的对象应该生成 id