Внешний ключ типа String в Hibernate - PullRequest
0 голосов
/ 15 мая 2019

Я использую Spring boot для разработки Hibernate-JPA.Мой внешний ключ имеет тип String.Когда я проверяю базу данных MYSQL после тестов Junit, я замечаю, что поле внешнего ключа в базе данных пусто

Мой код такой, как показано ниже:

Дочерний класс:

@Entity @Table(name = "nodes")
public class Nodes { 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private int node_id;
    private String name;
    private Date created_at;    

    @ManyToOne
    @JoinColumn(name="type", insertable=false, updatable=false)
    private Nodetypes nodetypes;

    @OneToMany(mappedBy = "nodes", cascade = CascadeType.ALL)
    private Set <Nodeattributes> nodeattributes;

    @OneToMany(mappedBy = "nodes", cascade = CascadeType.ALL)
    private Set <Products> products;

    public Set<Products> getProducts() {
        return products;
    }

    public void setProducts(Set<Products> products) {
        this.products = products;
    }

    public Set<Nodeattributes> getNodeattributes() {
        return nodeattributes;
    }

    public void setNodeattributes(Set<Nodeattributes> nodeattributes) {
        this.nodeattributes = nodeattributes;
    }

    public Nodetypes getNodetypes() {
        return nodetypes;
    }

    public void setNodetypes(Nodetypes nodetypes) {
        this.nodetypes = nodetypes;
    }


    public int getId() {
        return id;
    }

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

    public int getNode_id() {
        return node_id;
    }

    public void setNode_id(int node_id) {
        this.node_id = node_id;
    }

    public String getName() {
        return name;
    }

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

    public Date getCreated_at() {
        return created_at;
    }

    public void setCreated_at(Date created_at) {
        this.created_at = created_at;
    }
}

Родительский класс:

    @Entity @Table(name = "node_types")
    public class Nodetypes {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String label;
    private String name;
    private Boolean is_group;
    private Date created_at;
    private String type;

    public String getType() {
        return type;
    }

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

    @OneToMany(mappedBy = "nodetypes", cascade = CascadeType.ALL)
    private Set<Nodes> nodes;

    public Set<Nodes> getNodes() {
        return nodes;
    }

    public void setNodes(Set<Nodes> nodes) {
        this.nodes = nodes;
    }

    public int getId() {
        return id;
    }

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

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getName() {
        return name;
    }

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

    public Boolean getIs_group() {
        return is_group;
    }

    public void setIs_group(Boolean is_group) {
        this.is_group = is_group;
    }

    public Date getCreated_at() {
        return created_at;
    }

    public void setCreated_at(Date created_at) {
        this.created_at = created_at;
}

В моих тестовых условиях генерируется пустое поле для внешнего ключа в базе данных MYSQL

    @Test
    public void testCreateNodetype() {
        Nodetypes nodetypes = new Nodetypes();
        nodetypes.setId(1);
        nodetypes.setLabel("myLabel");
        nodetypes.setName(44);
        nodetypes.setIs_group(true);
        nodetypes.setCreated_at(new java.util.Date());

        nodetypesRepository.save(nodetypes);
    }

    @Test
    public void testCreateNodes() {
        Nodes node1 = new Nodes();
        node1.setCreated_at(new java.util.Date());
        node1.setName("nodeName");
        node1.setNode_id(444);
        node1.setNodetypes(nodetypesRepository.findOne(1));

        nodesRepository.save(node1);
    }

здесь используется схема MYSql Это родительская таблица:

    CREATE TABLE `node_types` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `label` varchar(255) NOT NULL COMMENT 'display name',
  `name` varchar(255) NOT NULL COMMENT 'unique identification',
  `is_group` tinyint(1) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
)

Это дочерний стол:

    CREATE TABLE `nodes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `node_id` int(11) DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  `type` varchar(255) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `type_foreign_to_node_types` (`type`),

  CONSTRAINT `type_foreign_to_node_types` FOREIGN KEY (`type`) REFERENCES `node_types` (`name`)
) ```

Any help would be apreciated

1 Ответ

1 голос
/ 15 мая 2019

Обнаружена одна проблема с моделированием сущностей для класса ниже

CREATE TABLE `node_types` (
  `name` varchar(255) NOT NULL COMMENT 'unique identification'
@Entity @Table(name = "node_types")
    public class Nodetypes {
    private int name;

. Измените тип восстановления имени с int на String

@Entity @Table(name = "node_types")
    public class Nodetypes {
    private String name;

Также измените метод тестирования на

    @Test
    public void testCreateNodetype() {
      ...
        nodetypes.setName("44");
      ... 
    }

Это должно работать нормально.

Вот записи в таблицах:

nodetypes nodes enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...