Почему сущность не хранится в базе данных? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть два связанных лица.При сохранении в базу данных успешно сохраняется только один объект.Второй с внешним ключом не сохраняется.Второй, который имеет внешний ключ, является списком объектов. Пожалуйста, помогите.

здесь я добавил cascade = CascadeType.ALL, но он все еще не работал

@Entity
@Table(name = "MyOrder")
public class MyOrder {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @OneToMany(mappedBy = "myOrder")
    private List<Products> productses;

Я добавил fetch = Fetch.LAZY,это тоже не помогло.

@Entity
@Table(name = "Products")
public class Products {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @ManyToOne
    @JoinColumn(name = "product_myorder_id")
    private MyOrder myOrder;

В контроллере я его заполняю:

        MyOrder myOrder = new MyOrder();
        List<Products2> products2s =  object.getProductses2();
        List<Products> productses =  new ArrayList<Products>();
        for(int i =0;i<products2s.size();i++){
            Products2 products2 = products2s.get(i);
            Products products = new Products();

            products.setName(products2.getName());
            products.setWeight(products2.getWeight());
            products.setAmount(products2.getAmount());
            products.setPrice(products2.getPrice());
            productses.add(products);

        }
        myOrder.setProductses(productses);
        //saving
        serviceClass.createNewOrder(myOrder);

Класс обслуживания:

    @Repository
    @Transactional
    public class MyServiceClass {

        @Autowired
        @Qualifier(value = "sessionFactory")
        SessionFactory session;



       public boolean createNewOrder(MyOrder myOrder){
            session.getCurrentSession().save(myOrder);
            return true;
        }

}

Схема:

CREATE TABLE `myorder` (
  `myOrder_id` int(11) NOT NULL AUTO_INCREMENT,
  `date` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `myorder_company_id` int(11) DEFAULT NULL,
  `myorder_courier_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`myOrder_id`),
  KEY `FK_q6alh4tjuhyudpq770duori5h` (`myorder_company_id`),
  KEY `FK_lcjnn2172xke45f2gmsiyvtep` (`myorder_courier_id`),
  CONSTRAINT `FK_lcjnn2172xke45f2gmsiyvtep` FOREIGN KEY (`myorder_courier_id`) REFERENCES `courier` (`id`),
  CONSTRAINT `FK_q6alh4tjuhyudpq770duori5h` FOREIGN KEY (`myorder_company_id`) REFERENCES `company` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `amount` varchar(255) DEFAULT NULL,
  `consignation` bit(1) NOT NULL,
  `debt` bit(1) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `photo` varchar(255) DEFAULT NULL,
  `price` varchar(255) DEFAULT NULL,
  `rec_price` varchar(255) DEFAULT NULL,
  `returned` bit(1) NOT NULL,
  `weight` varchar(255) DEFAULT NULL,
  `product_categories_id` int(11) DEFAULT NULL,
  `product_company_id` int(11) DEFAULT NULL,
  `product_myorder_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_ovaxmqou7gnwgchnhbkp9tq1p` (`product_categories_id`),
  KEY `FK_kwu6gyind0d2bthu19fcrkkcf` (`product_company_id`),
  KEY `FK_jeh86q0ligae6ggjlq9lq89y5` (`product_myorder_id`),
  CONSTRAINT `FK_jeh86q0ligae6ggjlq9lq89y5` FOREIGN KEY (`product_myorder_id`) REFERENCES `myorder` (`myOrder_id`),
  CONSTRAINT `FK_kwu6gyind0d2bthu19fcrkkcf` FOREIGN KEY (`product_company_id`) REFERENCES `company` (`id`),
  CONSTRAINT `FK_ovaxmqou7gnwgchnhbkp9tq1p` FOREIGN KEY (`product_categories_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы должны рассмотреть следующее отображение:

  • использовать Long для столбца id, а не int - int слишком мало
  • Двунаправленное отображение, вероятно, лучше
  • haveСлужебные методы для добавления / удаления дочерних элементов (как в коде ниже)
  • инициализируют ваши коллекции в классах Entity, чтобы избежать нулевых значений

Пример:

@Entity(name = "MyOrder")
@Table(name = "myorder")
public class MyOrder {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "myorder", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Product> products = new ArrayList<>();

    //Constructors, getters, setters etc.

    public void addProduct(Product product) {
        products.add(product);
        product.setMyOrder(this);
    }

    public void removeProduct(Product product) {
        products.remove(product);
        product.setMyOrder(null);
    }
}

@Entity(name = "Product")
@Table(name = "product")
public class Product {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "myorder_id")
    private MyOrder myOrder;

    //Constructors, getters and setters

    //equals and hashCode
}
0 голосов
/ 16 февраля 2019

Ваши изменения не каскадно переходят из родительского в дочерний объект, вам нужно добавить его в ваше отображение:

@Entity
@Table(name = "MyOrder")
public class MyOrder {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @OneToMany(mappedBy = "myOrder", cascade = CascadeType.All)
    private List<Products> productses;

При ошибке имени столбца попробуйте следующее:

@ManyToOne
@JoinColumn(name = "myorder_id")
private MyOrder myOrder;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...