我是 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
最佳答案
添加 @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/