【问题标题】:Why the entity is not stored in the database?为什么实体没有存储在数据库中?
【发布时间】:2019-02-16 16:21:21
【问题描述】:

我有两张相关的面孔。保存到数据库时,只有一个对象被成功保存。第二个带外键的不保存。第二个有外键的是 List objects Please help.

这里我加了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;

【问题讨论】:

  • 请告诉我您在哪个实体中添加了 cascade = CascadeType.ALL
  • 在我的订单上,这里:@OneToMany(mappedBy = "myOrder",cascade = CascadeType.ALL) private List productses;
  • 刚刚尝试了另一种方式,在产品中添加了级联。它没有帮助

标签: java mysql sql spring kotlin


【解决方案1】:

您应该考虑以下映射:

  • 对 id 列使用 Long,而不是 int - int 太小
  • 双向映射可能更好
  • 具有用于添加/删除子项的实用方法(如下面的代码所示)
  • 在实体类中初始化您的集合以避免空值

例子:

@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
}

【讨论】:

  • 不错,全面的改进列表
【解决方案2】:

您的更改没有从父实体级联到子实体,您需要将其添加到您的映射中:

@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;

【讨论】:

  • 我试过你的代码,得到一个错误:根本原因 java.sql.SQLException:字段 'myOrder_id' 没有默认值 com.mysql.jdbc.SQLError.createSQLException(SQLError.java: 1094) com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226) com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158) com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615) com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776) com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2840)
  • 我猜你没有准确指定列名,我会编辑答案。但这是另一种错误。你可以看到,有问题的问题已经解决了——孩子们得救了。
  • 重命名id无效。异常消失了,但只保存了MyOrder
  • 我删除了表并再次启动项目,一切都保存了。只有 Products 的外键为空(null)。好像没有联系一样。
  • 尝试为每个Product设置for循环:product.setMyOrder(myOrder)
猜你喜欢
  • 2019-11-06
  • 2017-10-17
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2015-06-22
相关资源
最近更新 更多