gpt4 book ai didi

java - Hibernate一对多关系java.sql.SQLIntegrityConstraintViolationException : Column 'person_id' cannot be null

转载 作者:行者123 更新时间:2023-11-29 04:14:03 25 4
gpt4 key购买 nike

我是 hibernate 新手,学习 doc 保存持久对象

已关注 hibernate doc这是人和电话的一对多关系

@Entity
@Table(name = "phone")
public class Phone {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name = "number")
private String number;

@ManyToOne(fetch = FetchType.LAZY)
private Person person;

//omit setter and getter
}

@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String username;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
private List<Phone> phones = new ArrayList<>();
//omit getter and setter
}

我是个执着的人,加一个电话就报错

@Test
public void say() {
Person person = new Person();
person.setUsername("aaaa");

Phone phone = new Phone();
phone.setNumber("111");

person.getPhones().add(phone);

personService.save(person);
}

这是道的执着

public class PersonDaoImpl implements PersonDao {
@PersistenceContext
private EntityManager entityManager;

@Override
public void save(Person person) {
entityManager.persist(person);
}

更新服务代码,服务只是救人

@Service(value = "personService")
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonDao personDao;

@Transactional
@Override
public void save(Person person) {
personDao.save(person);
}
}

错误信息:

    23:35:47.059 [main] DEBUG org.hibernate.engine.spi.ActionQueue - Executing identity-insert immediately
23:35:47.062 [main] DEBUG org.hibernate.SQL -
insert
into
phone
(number, person_id)
values
(?, ?)
23:35:47.297 [main] DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a]
java.sql.SQLIntegrityConstraintViolationException: Column 'person_id' cannot be null

erro img info

最佳答案

添加 @GeneratedValue 注释以指定两个实体的主键将在您的代码之外填充。

@Entity
@Table(name = "phone")
public class Phone {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

@Column(name = "number")
private String number;

@JoinColumn("person_id")
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Person person;

//omit setter and getter
}


public class Person {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private String username;

@OneToMany(mappedBy = "person")
private List<Phone> phones = new ArrayList<>();
//omit getter and setter
}

此外,您需要保留Person 对象而不是Phone 对象,因为没有配置从Phone 的级联人。如果您不能这样做,请将 Person 上的 CascadeType 切换为 none,然后将级联放在 Phone 上,如上所示。

您还应该在 Phone 实体上添加一个 @JoinColumn 注释,以便 hibernate 知道外键列。

关于java - Hibernate一对多关系java.sql.SQLIntegrityConstraintViolationException : Column 'person_id' cannot be null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com