Json 实体创建无用的id字段

Json 实体创建无用的id字段,json,entity-framework,hibernate,Json,Entity Framework,Hibernate,我有一个包含两个实体的crudepository 问题:特征实体总是在数据库中创建一个额外的id字段,但没有选择正确的特征id字段来生成JSON 机器实体 machine_id || name || description @Entity 特征实体 characteristic_id || machine_id || name || description || type || value @Entity 问题:为什么特征实体总是创建一个名为id的id字段,而不使用定义的字段特征\u i

我有一个包含两个实体的
crudepository

问题:特征实体总是在数据库中创建一个额外的id字段,但没有选择正确的
特征id
字段来生成
JSON

机器实体

machine_id || name || description
@Entity
特征实体

characteristic_id || machine_id || name || description || type || value
@Entity
问题:为什么特征实体总是创建一个名为
id
的id字段,而不使用定义的字段
特征\u id

JSON

实体如何操作数据库布局:

机器实体

machine_id || name || description
@Entity
@表(name=“maschine”) 公共类机器{ 专用int机器识别码

private String name;

private String description; 

private Set<Characteristic> characteristics;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "machine", cascade = CascadeType.ALL)
public Set<Characteristic> getCharacteristics() {
    return characteristics; 
}

public void setCharacteristics(Set<Characteristic> characteristics){
    this.characteristics = characteristics;
}

public Machine(){}

public Machine(String name, String description){
    this.name = name;
    this.description = description; 
}

@Override
public String toString() {
    return "Machine [id=" + machine_id + ", name=" + name + ", description=" + description + "]";
}

@Id 
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
public int getId() {
    return machine_id;
}

public void setId(int machine_id) {
    this.machine_id = machine_id;
}

@Column(name="name")
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Column(name="description")
public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}
@表(name=“characteristic”) 公共阶级特征{ 私有int特征id

private String name; 

private String description; 

private int type; 

private int value;

private Machine machine; 

@ManyToOne
@JoinColumn(name="machine_id")
public Machine getMachine(){
    return machine;
}

public void setMachine(Machine machine){
    this.machine = machine;
}

public Characteristic() {} 

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
public int getCharacteristic_Id() {
    return characteristic_id;
}

public void setCharacteristic_Id(int characteristic_id) {
    this.characteristic_id = characteristic_id;
}

@Column(name="name")
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Column(name="description")
public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

@Column(name="type")
public int getType() {
    return type;
}

public void setType(int type) {
    this.type = type;
}

@Column(name="value")
public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

@Override
public String toString() {
    return "Characteristic [id=" + characteristic_id + ", name=" + name + ", description=" + description + ", type=" + type
            + ", value=" + value + "]";
}
}

我的CRUDepository与数据库交互:

public interface MachineRepository extends CrudRepository<Machine, Integer>{

}
公共接口机器存储扩展了CRUDEPository{
}
我的控制器:

@RestController
public class HomeController {

    private final MachineRepository machineRepository;

    @Autowired
    HomeController(MachineRepository machineRepository) {
        this.machineRepository = machineRepository;
    }

    @RequestMapping(value = "/machine", method = RequestMethod.GET)
    Collection<Machine> readMachines(){
        return (Collection<Machine>) machineRepository.findAll();
    }

}
@RestController
公共类家庭控制器{
私人最终机器储存机器储存;
@自动连线
家庭控制器(机器存储机器存储){
this.machineRepository=machineRepository;
}
@RequestMapping(value=“/machine”,method=RequestMethod.GET)
收集读取器(){
return(Collection)machineRepository.findAll();
}
}

这是我为数据库操作编写的所有代码。

默认情况下,由于您没有在配置中指定列名,hibernate将使用getter方法的名称,而不使用“get”部分作为表中的列名。下面是您的特征实体中的配置

@Id
@GeneratedValue
public int getId() {
    return characteristic_id;
}
由于您没有为memeber characteristic_id指定任何显式列名,hibernate默认选择id(从getId()方法中删除get)作为成员的列名。因此,它总是为您的characteristics_id成员创建一个名为id的列

为了强制hibernate使用characteristic_id作为列名,可以使用@column注释并提供列名作为characteristics_id 除了用于标记getter的@Id和@GeneratedValue之外

@Id
@GeneratedValue
@Column(name="characteristic_id")
public int getId() {
    return characteristic_id;
}
或者您可以更改getter和setter的名称,如下所示

@Id
@GeneratedValue
public int getCharacterisitc_id() {
    return characteristic_id;
}

public void setCharacterisitc_id(int characteristic_id) {
    this.characteristic_id = characteristic_id;
}
更改此代码

@Id
@GeneratedValue
@Column(name="id", nullable = false)
public int getCharacteristic_id() {
    return characteristic_id;
}

谢谢你的帮助。不幸的是,在用你的建议修改了我的代码后,我得到了一个空数组。因此服务器响应一个空JSON对象。你知道为什么会发生这种情况吗?请检查是否从数据库返回了实体…如果是,问题将出现在你试图映射的代码中将实体转换为json。否则问题将出现在您的DAO编码中。您还可以发布获取相关实体的DAO代码吗???您是否检查了实体是否返回。在更新的帖子中,我看到findAll()方法返回机器实体集合。您能检查findAll()的实现吗方法..并查看它是如何从数据库中检索计算机数据的我也看到了您的计算机实体中的相同问题..请将您的计算机id的配置更新为特征实体的配置..请尝试使用更改的配置在数据库中插入一些记录,然后运行fetch..以查看其工作是否正常您确定正确吗?将列的名称更改为“id”意味着spring将创建一个名为“id”的新列,并且不再使用列“characteristic\u id”。“characteristic\u id”是表中每个特征的主键,每个特征都有一个与机器表相关的机器id。这不是spring的注释,我可以从您的问题中删除spring标记。您应该接受并投票支持帮助您的答案。