2016-11-24 3 views
0

Я пытаюсь создать столбцы соединения в 2 таблицах в БД MySQL с использованием Hibernate, однако я не могу заставить его работать. Я действительно новичок в этом, поэтому, возможно, я не понял его правильно, прежде чем искать его раньше.Hibernate, соединяющий столбцы

Я создаю проект викторины для своей школы. Учитель может создавать задания. Для этого я создал ER diagram. Если есть что-то, что я должен изменить, я открыт для всех предложений.

Это становилось все более грязным, поэтому я только что создал новый проект (но идея такая же), так что легче не потеряться в коде. Я пытаюсь присоединиться к таблице Box (Учитель в проекте) и Stuff (Задачи в проекте). Просто быстрая заметка, я пробовал некоторые варианты с аннотациями, но это тоже не сработало.

Box класс

@Entity 
public class Box { 

private int size, box_id; 

private String name, shape, colour, material; 

public Box(String name, int size, String shape, String colour, String material) { 
    this.name = name; 
    this.size = size; 
    this.shape = shape; 
    this.colour = colour; 
    this.material = material; 
} 

public Box() { 

} 

@Id 
@GenericGenerator(name="id" , strategy="increment") 
@GeneratedValue(generator="id") 
public int getBox_id() { 
    return box_id; 
} 

public void setBox_id(int box_id) { 
    this.box_id = box_id; 
} 

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

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

@Column(nullable = false) 
public int getSize() { 
    return size; 
} 

public void setSize(int size) { 
    this.size = size; 
} 

@Column(nullable = false) 
public String getShape() { 
    return shape; 
} 

public void setShape(String shape) { 
    this.shape = shape; 
} 

@Column(nullable = false) 
public String getColour() { 
    return colour; 
} 

public void setColour(String colour) { 
    this.colour = colour; 
} 

@Column(nullable = false) 
public String getMaterial() { 
    return material; 
} 

public void setMaterial(String material) { 
    this.material = material; 
} 
} 

Материал класс

@Entity 
    public class Stuff { 

     private int amount, stuff_id; 

     private String name, type, colour, material; 

     @ManyToOne 
     @JoinColumn(name = "stuff_id") 

     private Box box; 

     public Stuff(String name, int amount, String type, String colour, String material, Box box) { 
      this.name = name; 
      this.amount = amount; 
      this.type = type; 
      this.colour = colour; 
      this.material = material; 
      this.box = box; 
     } 

     public Stuff() { 
     } 

     @Id 
     @GenericGenerator(name="id" , strategy="increment") 
     @GeneratedValue(generator="id") 
     public int getStuff_id() { 
      return stuff_id; 
     } 

     public void setStuff_id(int stuff_id) { 
      this.stuff_id = stuff_id; 
     } 

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

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

     @Column(nullable = false) 
     public int getAmount() { 
      return amount; 
     } 

     public void setAmount(int amount) { 
      this.amount = amount; 
     } 

     @Column(nullable = false) 
     public String getType() { 
      return type; 
     } 

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

     @Column(nullable = false) 
     public String getColour() { 
      return colour; 
     } 

     public void setColour(String colour) { 
      this.colour = colour; 
     } 

     @Column(nullable = false) 
     public String getMaterial() { 
      return material; 
     } 

     public void setMaterial(String material) { 
      this.material = material; 
     } 

     @Column(nullable = false) 
     public Box getBox() { 
      return box; 
     } 

     public void setBox(Box box) { 
      this.box = box; 
     } 
     } 

После этого, я просто пытаюсь поставить 3 экземпляра Box и 9 экземпляров Материала в БД, как это.

new BoxDao().instertBox(new Box("box1", 10, "cube", "green", "cardboard")); 
new StuffDao().instertStuff(new Stuff("stuff1", 5, "toys", "red", "plastic", new BoxDao().getBoxById(1))); 

Ошибка я получаю это:

Caused by: org.hibernate.MappingException: Could not determine type for: model.Box, at table: Stuff, for columns: [org.hibernate.mapping.Column(box)] 

Я ценю каждый ответ, извините, если это что-то очевидно, но я, наверное, просто пропустил то, что случилось. Спасибо.

ответ

1

Вы должны быть согласованы с тем, где вы размещаете аннотации отображения в сущности. Либо вы кладете их все на геттеры, либо вы кладете их на поля.

Поскольку вы помещаете аннотацию Идентификатора геттера, но аннотацию ManyToOne в поле, ManyToOne игнорируется Hibernate.

Обратите внимание, что сопоставление не имеет большого смысла: столбец, используемый для однозначной идентификации материала, не может также использоваться для ссылки на поле. И свойство box не может быть аннотировано с помощью столбца и вместе с JoinColumn. Это JoinColumn, а не столбец.

+0

О, ничего себе. Я даже поменял идентификаторы для присоединения к классу Stuff. Ну, спасибо за помощь, теперь это работает. –