【问题标题】:How to do auto increment primary keys onetomany create operation?如何进行自动递增主键单机创建操作?
【发布时间】:2015-12-10 08:20:52
【问题描述】:

这里Customer_id 是加入列。我在 oneToMany 关系中有两个表客户和地址。因为两者都有主键是自动递增的。

几个要点是:

  1. OneToMany 单向关系。
  2. 对应表中的主键是自动递增的。
  3. 新建时出现问题

Customer.java

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="customer_id", unique=true, nullable=false)
private long customerId;

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name="address", joinColumns={@JoinColumn(name="customer_id", referencedColumnName="customer_id")}, inverseJoinColumns={@JoinColumn(name="account_id", referencedColumnName="account_id")})
private List<Address> addresses;

Address.java

@Column(name="customer_id", unique=true, nullable=false)
private int   customerId;

表格:

CREATE TABLE `customer` (
  `customer_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `encrypt_key` varchar(200) NOT NULL,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `email` varchar(50) DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `self_description` varchar(2000) NOT NULL,
  PRIMARY KEY (`customer_id`),
  KEY `idx_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;

CREATE TABLE `address` (
  `account_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `customer_id` smallint(5) unsigned NOT NULL,
  `address_type` varchar(15) NOT NULL,  -- Office, Branch-1, Branch-2, 
  `door_num` varchar(50) NOT NULL,
  `landmark` varchar(150) DEFAULT NULL,
  `street` varchar(50) DEFAULT NULL,
  `area_name` varchar(25) NOT NULL,
  `district` varchar(25) NOT NULL,
  `city` varchar(25) NOT NULL,
  `postal_code` varchar(10) DEFAULT NULL,
  `phone1` varchar(20) NOT NULL,
  `phone2` varchar(20),
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`account_id`),
  KEY `idx_fk_city` (`city`),
  CONSTRAINT `fk_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8;

虽然我正在创建一个新客户,但我出现了这样的错误。

SqlExceptionHelper:144 - SQL 错误:1452,SQLState:23000 2015-12-10 13:39:32 错误 SqlExceptionHelper:146 - 无法添加或更新孩子 行:外键约束失败(mobily.address, CONSTRAINT fk_customer_id 外键 (customer_id) 参考 customer (customer_id) 更新级联)

因为:custmer_idAddress 对象中以“0”形式出现。但那是

Customer 保存前的对象。这是:

customer    Customer  (id=90)   
    active  1   
    addresses   ArrayList<E>  (id=95)   
        elementData Object[10]  (id=117)    
            [0] Address  (id=119)   
                accountId   0   
                addressType "main office" (id=121)  
                areaName    "area3" (id=122)    
                city    "city3" (id=123)    
                customerId  0   
                district    "district3" (id=124)    
                doorNum "89" (id=125)   
                landmark    "landmark3" (id=126)    
                phone1  "646432365465" (id=127) 
                phone2  "4534542355675" (id=128)    
                postalCode  "453245" (id=129)   
                street  "street3" (id=130)  
        modCount    1   
        size    1   
    customerId  0   
    email   "bbb@gmail.com" (id=104)    
    encryptKey  "wwwwwfsad" (id=109)    
    firstName   "xxx" (id=110)  
    lastName    "yyy" (id=111)  
    password    "user3" (id=112)    
    selfDescription "user3" (id=113)    
    theme   Theme  (id=114) 
    userName    "user3" (id=116)    

【问题讨论】:

  • 在您尝试保存对象的位置显示您的 DAO 代码。

标签: spring jpa jpa-2.0


【解决方案1】:

从您的 SQL 表中删除自动增量。并以这种方式配置您的模型:

@Id
@Column(name = "primary_key_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "chat_seq_gen")
@SequenceGenerator(name = "chat_seq_gen", sequenceName = "chat_seq")
private Long chatid;

然后创建一个名为 chat_seq(对于此类)的序列,就应该这样。这是你想要的?如果不是,请让我知道,我删除我的答案。

编辑

同样在您的 Address.java 中,您应该像这样引用客户:

@ManyToOne
@JoinColumn(name = "customerid", nullable = false)
private Customer customerAddresses;

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 2015-09-03
    • 1970-01-01
    • 2015-11-13
    • 2015-06-18
    • 2023-03-26
    • 2014-01-17
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多