我正在尝试学习JPA,我有一个问题,我在2天后陷入困境。
我有一个名为“用户”的表格,包括ID,电子邮件,密码,用户名和状态。
您认为电子邮件和用户名列是唯一的。
我还有一个名为User的类:
@Entity
@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = {"username", "email"}))
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(name="email", nullable=false)
private String email;
@Column(name="password", nullable=false)
private String password;
@Column(name="username", nullable=false)
private String username;
@Column(name="status", nullable=false)
private String status;
本课程的其余部分是getter和setter。
我正在尝试使用JPA和Hibernate插入一个值。
try {
em = jpaResourceBean.getEMF().createEntityManager();
em.getTransaction().begin();
user.setStatus(UserStatus.PENDING.toString());
em.persist(user);
em.getTransaction().commit();
logger.info("User " + user.getUsername() + " has been registered");
// Attention starts
} catch (XXXXXX) {
if (XXXXX.getYYY().equals("ZZZZZ")) logger.info("User name is already exist");
if (XXXXX.getMMM().equals("LLLLL")) logger.info("Email is already exist");
}
// Attention end
我只想知道:我如何理解用户名约束或电子邮件唯一约束的问题?虽然您可以检查我的注意开始和结束块,但我确信您明白了我的观点:)
提前致谢。
答案 0 :(得分:2)
您不应该在生产中使用自动生成的模式,所以为什么不在模式中简单地设置约束名称。然后,当生成异常时,您将获得失败的约束名称。
create table users (
user varchar2(20) not null,
email varchar2(20) not null,
constraint user_uq unique(user),
constraint email_uq unique(email)
)
您可能希望在插入之前查看数据库,看看它们是否已经存在..那么您很可能不会得到异常......
答案 1 :(得分:0)
试试这个:
catch(javax.validation.ConstraintViolationException exception) {
Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
...
}